From b4ce33141d7f7950f6e21fbea8c2c6246f5667e3 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 26 Oct 2024 21:08:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE.zh-CN.md | 15 -- .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 15 -- .../annotation/DynamicTableName.java | 3 + .../extension/kt/segments/FuncArgs.java | 2 +- .../yulichang/method/MPJBaseMethod.java | 6 +- .../query/MPJLambdaQueryWrapper.java | 6 +- .../yulichang/query/MPJQueryWrapper.java | 6 +- .../yulichang/toolkit/WrapperUtils.java | 33 +-- .../wrapper/JoinAbstractLambdaWrapper.java | 24 +- .../wrapper/JoinAbstractWrapper.java | 114 +++++++- .../yulichang/wrapper/MPJLambdaWrapper.java | 40 +-- .../yulichang/wrapper/interfaces/Compare.java | 3 +- .../wrapper/interfaces/CompareWrapper.java | 151 +++++++++++ .../yulichang/wrapper/interfaces/Func.java | 4 +- .../wrapper/interfaces/FuncWrapper.java | 86 ++++++ .../wrapper/interfaces/QueryJoin.java | 78 ------ .../yulichang/wrapper/segments/Fun.java | 18 +- .../wrapper/segments/SelectFunc.java | 17 +- mybatis-plus-join-test/pom.xml | 4 +- mybatis-plus-join-test/test-join/pom.xml | 1 - .../yulichang/test/join/entity/UserDO.java | 2 - .../test/join/unit/ConditionSubTest.java | 247 ++++++++++++++++++ .../yulichang/test/join/unit/FromTest.java | 46 ++++ .../test/join/unit/SelectFuncTest.java | 41 +++ .../test/join/unit/SelectSubTest.java | 28 +- .../yulichang/test/join/unit/UnionTest.java | 10 +- .../github/yulichang/test/kt/entity/UserDO.kt | 2 - pom.xml | 2 +- 28 files changed, 778 insertions(+), 226 deletions(-) delete mode 100644 .gitee/ISSUE_TEMPLATE.zh-CN.md delete mode 100644 .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareWrapper.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/FuncWrapper.java create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/ConditionSubTest.java create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/FromTest.java diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md deleted file mode 100644 index 59a9fc0..0000000 --- a/.gitee/ISSUE_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,15 +0,0 @@ -### 当前使用版本(必填,否则不予处理) - - - -### 该问题是如何引起的?(确定最新版也有问题再提!!!) - - - -### 重现步骤(如果有就写完整) - - - -### 报错信息 - - diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md deleted file mode 100644 index 061a184..0000000 --- a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,15 +0,0 @@ -### 该Pull Request关联的Issue - - - -### 修改描述 - - - -### 测试用例 - - - -### 修复效果的截屏 - - diff --git a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/DynamicTableName.java b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/DynamicTableName.java index daf8fc6..30d8ef1 100644 --- a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/DynamicTableName.java +++ b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/DynamicTableName.java @@ -4,10 +4,13 @@ import java.lang.annotation.*; /** * 动态表名注解 + *

+ * 1.5.2及以后无需添加此注解就可实现动态表名 * * @author yulichang * @since 1.4.4 */ +@Deprecated @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/kt/segments/FuncArgs.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/kt/segments/FuncArgs.java index a1b5db4..72fdcf9 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/kt/segments/FuncArgs.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/kt/segments/FuncArgs.java @@ -33,7 +33,7 @@ public class FuncArgs { public SelectFunc.Arg[] getFuncArg() { return Arrays.stream(args).map(i -> - new SelectFunc.Arg(KtUtils.ref(i), i.getName(), false, null, i)) + new SelectFunc.Arg(KtUtils.ref(i), i.getName(), false, null, i,false,null)) .toArray(SelectFunc.Arg[]::new); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java index c8f60e8..1cf149c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java @@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.adapter.AdapterHelper; import com.github.yulichang.adapter.base.metadata.OrderFieldInfo; -import com.github.yulichang.annotation.DynamicTableName; import com.github.yulichang.config.ConfigProperties; import java.io.UnsupportedEncodingException; @@ -123,6 +122,7 @@ public interface MPJBaseMethod extends Constants { tableFieldInfo.getWhereStrategy()); } + @SuppressWarnings({"DuplicatedCode", "deprecation"}) default String convertIf(TableFieldInfo tableFieldInfo, final String sqlScript, final String property, final FieldStrategy fieldStrategy) { if (fieldStrategy == FieldStrategy.NEVER) { return null; @@ -183,10 +183,6 @@ public interface MPJBaseMethod extends Constants { * 获取表名 */ default String mpjTableName(TableInfo tableInfo) { - DynamicTableName dynamicTableName = tableInfo.getEntityType().getAnnotation(DynamicTableName.class); - if (Objects.isNull(dynamicTableName)) { - return tableInfo.getTableName(); - } String tableName = tableInfo.getTableName(), encode; try { encode = URLEncoder.encode(tableName, "UTF-8"); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java index dde0ee7..593da16 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java @@ -302,11 +302,9 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper - * - * @see com.github.yulichang.annotation.DynamicTableName + * 如果主表需要动态表名 + *

*/ public MPJLambdaQueryWrapper setTableName(Function func) { this.tableNameFunc = func; diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java index 80c1af5..5ec189f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java @@ -314,11 +314,9 @@ public class MPJQueryWrapper extends AbstractWrapper - * - * @see com.github.yulichang.annotation.DynamicTableName + * 如果主表需要动态表名 + *

*/ public MPJQueryWrapper setTableName(Function func) { this.tableNameFunc = func; diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java index 8fd1356..7167b85 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java @@ -20,36 +20,7 @@ import java.util.Optional; public class WrapperUtils { public static String buildSubSqlByWrapper(Class clazz, MPJLambdaWrapper wrapper, String alias) { - TableInfo tableInfo = TableHelper.getAssert(clazz); - String first = Optional.ofNullable(wrapper.getSqlFirst()).orElse(StringPool.EMPTY); - boolean hasWhere = false; - String entityWhere = getEntitySql(tableInfo, wrapper); - if (StringUtils.isNotBlank(entityWhere)) { - hasWhere = true; - } - String mainLogic = mainLogic(hasWhere, clazz, wrapper); - if (StringUtils.isNotBlank(mainLogic)) { - hasWhere = true; - } - String subLogic = subLogic(hasWhere, wrapper); - if (StringUtils.isNotBlank(subLogic)) { - hasWhere = true; - } - String sqlSegment = (wrapper.getSqlSegment() != null && StringUtils.isNotBlank(wrapper.getSqlSegment())) ? - ((wrapper.isEmptyOfNormal() ? StringPool.EMPTY : (hasWhere ? " AND " : " WHERE ")) + wrapper.getSqlSegment()) : StringPool.EMPTY; - - String sqlComment = Optional.ofNullable(wrapper.getSqlComment()).orElse(StringPool.EMPTY); - return String.format(" (%s SELECT %s FROM %s %s %s %s %s %s %s) AS %s ", - first, - wrapper.getSqlSelect(), - wrapper.getTableName(tableInfo.getTableName()), - wrapper.getAlias(), - wrapper.getFrom(), - mainLogic, - subLogic, - sqlSegment, - sqlComment, - alias); + return String.format("%s AS %s", buildUnionSqlByWrapper(clazz, wrapper), alias); } public static String buildUnionSqlByWrapper(Class clazz, MPJLambdaWrapper wrapper) { @@ -72,7 +43,7 @@ public class WrapperUtils { ((wrapper.isEmptyOfNormal() ? StringPool.EMPTY : (hasWhere ? " AND " : " WHERE ")) + wrapper.getSqlSegment()) : StringPool.EMPTY; String sqlComment = Optional.ofNullable(wrapper.getSqlComment()).orElse(StringPool.EMPTY); - return String.format(" %s SELECT %s FROM %s %s %s %s %s %s %s ", + return String.format("( %s SELECT %s FROM %s %s %s %s %s %s %s )", first, wrapper.getSqlSelect(), wrapper.getTableName(tableInfo.getTableName()), diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java index ce85caa..918d220 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java @@ -43,15 +43,6 @@ import static java.util.stream.Collectors.joining; public abstract class JoinAbstractLambdaWrapper> extends JoinAbstractWrapper implements QueryJoin { - /** - * 主表别名 - */ - @Getter - protected String alias = ConfigProperties.tableAlias; - /** - * 副表别名 - */ - protected String subTableAlias = ConfigProperties.tableAlias; /** * 是否存在对一或对多 */ @@ -229,6 +220,9 @@ public abstract class JoinAbstractLambdaWrapper entityClass = getEntityClass(); if (entityClass != null) { TableInfo tableInfo = TableHelper.get(entityClass); @@ -433,6 +430,13 @@ public abstract class JoinAbstractLambdaWrapper> fromWrapper) { + Assert.notNull(getEntityClass(), "main table is null please use JoinWrapper.lambda(Class) or new MPJLambdaWrapper(Class)"); + MPJLambdaWrapper wrapper = fromWrapper.apply(fromInstance(getEntityClass())); + this.tableName = WrapperUtils.buildUnionSqlByWrapper(getEntityClass(), wrapper); + return typedThis; + } + /** * 内部调用, 不建议使用 */ @@ -452,7 +456,7 @@ public abstract class JoinAbstractLambdaWrapper, Nested, Join, Func, OnCompare, CompareStrIfExists, FuncStr { + /** + * 主表别名 + */ + @Getter + protected String alias = ConfigProperties.tableAlias; + /** + * 副表别名 + */ + protected String subTableAlias = ConfigProperties.tableAlias; /** * 占位符 */ @@ -155,6 +162,37 @@ public abstract class JoinAbstractWrapper MPJLambdaWrapper subInstance(Class clazz, String st) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), + paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias + .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + new TableList(), null, null, null, null, ifExists) { + }; + wrapper.tableList.setAlias(st); + wrapper.tableList.setRootClass(clazz); + wrapper.tableList.setParent(this.tableList); + wrapper.alias = st; + wrapper.subTableAlias = st; + return wrapper; + } + + protected MPJLambdaWrapper fromInstance(Class clazz) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), + paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias + .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + new TableList(), null, null, null, null, ifExists) { + }; + wrapper.tableList.setAlias(this.alias); + wrapper.tableList.setRootClass(clazz); + wrapper.alias = this.alias; + return wrapper; + } + + + protected MPJLambdaWrapper subInstance(Class clazz) { + return subInstance(clazz, ConfigProperties.subQueryAlias); + } + /** * 转为子类,方便自定义继承扩展 */ @@ -234,31 +272,61 @@ public abstract class JoinAbstractWrapper Children eq(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return addCondition(condition, alias, column, EQ, clazz, wrapper.apply(subInstance(clazz))); + } + @Override public Children ne(boolean condition, String alias, SFunction column, Object val) { return addCondition(condition, alias, column, NE, val); } + @Override + public Children ne(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return addCondition(condition, alias, column, NE, clazz, wrapper.apply(subInstance(clazz))); + } + @Override public Children gt(boolean condition, String alias, SFunction column, Object val) { return addCondition(condition, alias, column, GT, val); } + @Override + public Children gt(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return addCondition(condition, alias, column, GT, clazz, wrapper.apply(subInstance(clazz))); + } + @Override public Children ge(boolean condition, String alias, SFunction column, Object val) { return addCondition(condition, alias, column, GE, val); } + @Override + public Children ge(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return addCondition(condition, alias, column, GE, clazz, wrapper.apply(subInstance(clazz))); + } + @Override public Children lt(boolean condition, String alias, SFunction column, Object val) { return addCondition(condition, alias, column, LT, val); } + @Override + public Children lt(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return addCondition(condition, alias, column, LT, clazz, wrapper.apply(subInstance(clazz))); + } + @Override public Children le(boolean condition, String alias, SFunction column, Object val) { return addCondition(condition, alias, column, LE, val); } + @Override + public Children le(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return addCondition(condition, alias, column, LE, clazz, wrapper.apply(subInstance(clazz))); + } + @Override public Children like(boolean condition, String alias, SFunction column, Object val) { return likeValue(condition, LIKE, alias, column, val, SqlLike.DEFAULT); @@ -389,26 +457,55 @@ public abstract class JoinAbstractWrapper String.format("(%s)", formatSqlMaybeWithParam(existsSql, null, values)))); } + @Override + public Children exists(boolean condition, Class clazz, MFunction> wrapper) { + return maybeDo(condition, () -> appendSqlSegments(EXISTS, + () -> WrapperUtils.buildUnionSqlByWrapper(clazz, wrapper.apply(subInstance(clazz))))); + } + @Override public Children notExists(boolean condition, String existsSql, Object... values) { return not(condition).exists(condition, existsSql, values); } + @Override + public Children notExists(boolean condition, Class clazz, MFunction> wrapper) { + return not(condition).exists(condition, clazz, wrapper); + } + @Override public Children isNull(boolean condition, String alias, SFunction column) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), IS_NULL)); } + @Override + public Children isNull(boolean condition, String alias, Class clazz, MFunction> wrapper) { + return maybeDo(condition, () -> appendSqlSegments(() -> + WrapperUtils.buildUnionSqlByWrapper(clazz, wrapper.apply(fromInstance(clazz))), IS_NULL)); + } + @Override public Children isNotNull(boolean condition, String alias, SFunction column) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), IS_NOT_NULL)); } + @Override + public Children isNotNull(boolean condition, String alias, Class clazz, MFunction> wrapper) { + return maybeDo(condition, () -> appendSqlSegments(() -> + WrapperUtils.buildUnionSqlByWrapper(clazz, wrapper.apply(fromInstance(clazz))), IS_NOT_NULL)); + } + @Override public Children in(boolean condition, String alias, SFunction column, Collection coll) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), IN, inExpression(coll))); } + @Override + public Children in(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), IN, () -> + WrapperUtils.buildUnionSqlByWrapper(clazz, wrapper.apply(fromInstance(clazz))))); + } + @Override public Children in(boolean condition, String alias, SFunction column, Object... values) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), IN, inExpression(values))); @@ -419,6 +516,12 @@ public abstract class JoinAbstractWrapper appendSqlSegments(columnToSqlSegment(index, alias, column, false), NOT_IN, inExpression(coll))); } + @Override + public Children notIn(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), NOT_IN, () -> + WrapperUtils.buildUnionSqlByWrapper(clazz, wrapper.apply(fromInstance(clazz))))); + } + @Override public Children notIn(boolean condition, String alias, SFunction column, Object... values) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), NOT_IN, inExpression(values))); @@ -682,6 +785,11 @@ public abstract class JoinAbstractWrapper formatParam(null, val))); } + protected Children addCondition(boolean condition, String alias, SFunction column, SqlKeyword sqlKeyword, Class clazz, MPJLambdaWrapper val) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column, false), sqlKeyword, + () -> WrapperUtils.buildUnionSqlByWrapper(clazz, val))); + } + protected Children addCondition(boolean condition, String alias, SFunction column, SqlKeyword sqlKeyword, String rightAlias, SFunction val) { Class c = LambdaUtils.getEntityClass(column); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index e061063..a71002b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -253,16 +253,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper MPJLambdaWrapper selectSub(Class clazz, String st, Consumer> consumer, String alias) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), - paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias - .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null, ifExists) { - }; - wrapper.tableList.setAlias(st); - wrapper.tableList.setRootClass(clazz); - wrapper.tableList.setParent(this.tableList); - wrapper.alias = st; - wrapper.subTableAlias = st; + MPJLambdaWrapper wrapper = subInstance(clazz, st); consumer.accept(wrapper); this.selectColumns.add(new SelectSub(() -> WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias), hasAlias, this.alias, alias)); return typedThis; @@ -277,13 +268,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper MPJLambdaWrapper union(Class clazz, Consumer> consumer) { - MPJLambdaWrapper unionWrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), - paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias - .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null, ifExists) { - }; - unionWrapper.tableList.setAlias(ConfigProperties.tableAlias); - unionWrapper.tableList.setRootClass(clazz); + MPJLambdaWrapper unionWrapper = fromInstance(clazz); consumer.accept(unionWrapper); String sb = " UNION " + WrapperUtils.buildUnionSqlByWrapper(clazz, unionWrapper); @@ -320,13 +305,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper MPJLambdaWrapper unionAll(Class clazz, Consumer> consumer) { - MPJLambdaWrapper unionWrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), - paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias - .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null, ifExists) { - }; - unionWrapper.tableList.setAlias(ConfigProperties.tableAlias); - unionWrapper.tableList.setRootClass(clazz); + MPJLambdaWrapper unionWrapper = fromInstance(clazz); consumer.accept(unionWrapper); String sb = " UNION ALL " + WrapperUtils.buildUnionSqlByWrapper(clazz, unionWrapper); @@ -361,10 +340,15 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper { - String pf = arg.isHasTableAlias() ? arg.getTableAlias() : tableList.getPrefixByClass(arg.getClazz()); - Map mapField = ColumnCache.getMapField(arg.getClazz()); - SelectCache cache = mapField.get(arg.getProp()); - return pf + StringPool.DOT + cache.getColumn(); + if (arg.isSub()) { + Object o = arg.getSubFunc().apply(subInstance(arg.getClazz())); + return WrapperUtils.buildUnionSqlByWrapper(arg.getClazz(), (MPJLambdaWrapper) o); + } else { + String pf = arg.isHasTableAlias() ? arg.getTableAlias() : tableList.getPrefixByClass(arg.getClazz()); + Map mapField = ColumnCache.getMapField(arg.getClazz()); + SelectCache cache = mapField.get(arg.getProp()); + return pf + StringPool.DOT + cache.getColumn(); + } }).toArray()) + Constant.AS + i.getAlias(); } } else { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java index a9bd165..bf7e12f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java @@ -2,7 +2,6 @@ package com.github.yulichang.wrapper.interfaces; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import java.io.Serializable; import java.util.Map; import java.util.function.BiPredicate; @@ -12,7 +11,7 @@ import java.util.function.BiPredicate; * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} */ @SuppressWarnings("unused") -public interface Compare extends Serializable { +public interface Compare extends CompareWrapper { default Children allEq(Map, V> params) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareWrapper.java new file mode 100644 index 0000000..7a1c1ba --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareWrapper.java @@ -0,0 +1,151 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.wrapper.MPJLambdaWrapper; + +import java.io.Serializable; + +/** + * 将原来的泛型R改成SFunction + *

+ * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + */ +@SuppressWarnings("unused") +public interface CompareWrapper extends Serializable { + + default Children eq(SFunction column, Class clazz, MFunction> val) { + return eq(true, null, column, clazz, val); + } + + default Children eq(String alias, SFunction column, Class clazz, MFunction> val) { + return eq(true, alias, column, clazz, val); + } + + default Children eq(boolean condition, SFunction column, Class clazz, MFunction> val) { + return eq(condition, null, column, clazz, val); + } + + /** + * 等于 = + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children eq(boolean condition, String alias, SFunction column, Class clazz, MFunction> val); + + default Children ne(SFunction column, Class clazz, MFunction> val) { + return ne(true, null, column, clazz, val); + } + + default Children ne(String alias, SFunction column, Class clazz, MFunction> val) { + return ne(true, alias, column, clazz, val); + } + + default Children ne(boolean condition, SFunction column, Class clazz, MFunction> val) { + return ne(condition, null, column, clazz, val); + } + + /** + * 不等于 <> + * + * @param condition 执行条件 + * @param alias 字段别名 + * @param column 字段 + * @param val 值 + * @return children + */ + Children ne(boolean condition, String alias, SFunction column, Class clazz, MFunction> val); + + + default Children gt(SFunction column, Class clazz, MFunction> val) { + return gt(true, null, column, clazz, val); + } + + default Children gt(String alias, SFunction column, Class clazz, MFunction> val) { + return gt(true, alias, column, clazz, val); + } + + default Children gt(boolean condition, SFunction column, Class clazz, MFunction> val) { + return gt(condition, null, column, clazz, val); + } + + /** + * 大于 > + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children gt(boolean condition, String alias, SFunction column, Class clazz, MFunction> val); + + default Children ge(SFunction column, Class clazz, MFunction> val) { + return ge(true, null, column, clazz, val); + } + + default Children ge(String alias, SFunction column, Class clazz, MFunction> val) { + return ge(true, alias, column, clazz, val); + } + + default Children ge(boolean condition, SFunction column, Class clazz, MFunction> val) { + return ge(condition, null, column, clazz, val); + } + + /** + * 大于等于 >= + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children ge(boolean condition, String alias, SFunction column, Class clazz, MFunction> val); + + + default Children lt(SFunction column, Class clazz, MFunction> val) { + return lt(true, null, column, clazz, val); + } + + default Children lt(String alias, SFunction column, Class clazz, MFunction> val) { + return lt(true, alias, column, clazz, val); + } + + default Children lt(boolean condition, SFunction column, Class clazz, MFunction> val) { + return lt(condition, null, column, clazz, val); + } + + /** + * 小于 < + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children lt(boolean condition, String alias, SFunction column, Class clazz, MFunction> val); + + + default Children le(SFunction column, Class clazz, MFunction> val) { + return le(true, null, column, clazz, val); + } + + default Children le(String alias, SFunction column, Class clazz, MFunction> val) { + return le(true, alias, column, clazz, val); + } + + default Children le(boolean condition, SFunction column, Class clazz, MFunction> val) { + return le(condition, null, column, clazz, val); + } + + /** + * 小于等于 <= + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children le(boolean condition, String alias, SFunction column, Class clazz, MFunction> val); +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java index 3409b27..a1f945f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java @@ -2,7 +2,6 @@ package com.github.yulichang.wrapper.interfaces; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.function.Consumer; @@ -13,7 +12,7 @@ import java.util.function.Consumer; * copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Func} */ @SuppressWarnings({"unchecked", "unused"}) -public interface Func extends Serializable { +public interface Func extends FuncWrapper { default Children isNull(SFunction column) { @@ -514,7 +513,6 @@ public interface Func extends Serializable { */ Children having(boolean condition, String sqlHaving, Object... params); - default Children func(Consumer consumer) { return func(true, consumer); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/FuncWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/FuncWrapper.java new file mode 100644 index 0000000..8c2eb9e --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/FuncWrapper.java @@ -0,0 +1,86 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.wrapper.MPJLambdaWrapper; + +import java.io.Serializable; + +/** + * 将原来的泛型R改成SFunction + *

+ * copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Func} + */ +@SuppressWarnings({"unused"}) +public interface FuncWrapper extends Serializable { + + + default Children isNull(Class clazz, MFunction> wrapper) { + return isNull(true, null, clazz, wrapper); + } + + default Children isNull(String alias, Class clazz, MFunction> wrapper) { + return isNull(true, alias, clazz, wrapper); + } + + default Children isNull(boolean condition, Class clazz, MFunction> wrapper) { + return isNull(condition, null, clazz, wrapper); + } + + Children isNull(boolean condition, String alias, Class clazz, MFunction> wrapper); + + + default Children isNotNull(Class clazz, MFunction> wrapper) { + return isNotNull(true, null, clazz, wrapper); + } + + default Children isNotNull(String alias, Class clazz, MFunction> wrapper) { + return isNotNull(true, alias, clazz, wrapper); + } + + default Children isNotNull(boolean condition, Class clazz, MFunction> wrapper) { + return isNotNull(condition, null, clazz, wrapper); + } + + Children isNotNull(boolean condition, String alias, Class clazz, MFunction> wrapper); + + default Children in(SFunction column, Class clazz, MFunction> wrapper) { + return in(true, null, column, clazz, wrapper); + } + + default Children in(String alias, SFunction column, Class clazz, MFunction> wrapper) { + return in(true, alias, column, clazz, wrapper); + } + + default Children in(boolean condition, SFunction column, Class clazz, MFunction> wrapper) { + return in(condition, null, column, clazz, wrapper); + } + + Children in(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper); + + + default Children notIn(SFunction column, Class clazz, MFunction> wrapper) { + return notIn(true, null, column, clazz, wrapper); + } + + default Children notIn(String alias, SFunction column, Class clazz, MFunction> wrapper) { + return notIn(true, alias, column, clazz, wrapper); + } + + default Children notIn(boolean condition, SFunction column, Class clazz, MFunction> wrapper) { + return notIn(condition, null, column, clazz, wrapper); + } + + Children notIn(boolean condition, String alias, SFunction column, Class clazz, MFunction> wrapper); + + default Children exists(Class clazz, MFunction> wrapper) { + return exists(true, clazz, wrapper); + } + + Children exists(boolean condition, Class clazz, MFunction> wrapper); + + default Children notExists(Class clazz, MFunction> wrapper) { + return notExists(true, clazz, wrapper); + } + + Children notExists(boolean condition, Class clazz, MFunction> wrapper); +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java index a25efad..6abc330 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java @@ -34,7 +34,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, left, rightAlias, right); } @@ -47,7 +46,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件` */ default Children leftJoin(Class clazz, MFunction> function) { - return join(Constant.LEFT_JOIN, clazz, function); } @@ -59,7 +57,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, SFunction left, SFunction right, MFunction ext) { - return join(Constant.LEFT_JOIN, clazz, left, right, ext); } @@ -72,7 +69,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param consumer 条件 */ default Children leftJoin(Class clazz, BiConsumer, Children> consumer) { - return join(Constant.LEFT_JOIN, clazz, consumer); } @@ -84,7 +80,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, String alias, SFunction left, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, alias, left, right); } @@ -97,7 +92,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, alias, left, rightAlias, right); } @@ -110,7 +104,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件 */ default Children leftJoin(Class clazz, String alias, MFunction> function) { - return join(Constant.LEFT_JOIN, clazz, alias, function); } @@ -122,7 +115,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, String alias, SFunction left, SFunction right, MFunction ext) { - return join(Constant.LEFT_JOIN, clazz, alias, left, right, ext); } @@ -135,7 +127,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param consumer 条件 */ default Children leftJoin(Class clazz, String alias, BiConsumer, Children> consumer) { - return join(Constant.LEFT_JOIN, clazz, alias, consumer); } @@ -147,7 +138,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, MConsumer> table, SFunction left, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, table, left, right); } @@ -160,7 +150,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, MConsumer> table, SFunction left, String rightAlias, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, table, left, rightAlias, right); } @@ -173,7 +162,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件` */ default Children leftJoin(Class clazz, MConsumer> table, MFunction> function) { - return join(Constant.LEFT_JOIN, clazz, table, function); } @@ -185,7 +173,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, MConsumer> table, SFunction left, SFunction right, MFunction ext) { - return join(Constant.LEFT_JOIN, clazz, table, left, right, ext); } @@ -198,7 +185,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param consumer 条件 */ default Children leftJoin(Class clazz, MConsumer> table, BiConsumer, Children> consumer) { - return join(Constant.LEFT_JOIN, clazz, table, consumer); } @@ -210,7 +196,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, MConsumer> table, String alias, SFunction left, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, table, alias, left, right); } @@ -223,7 +208,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, MConsumer> table, String alias, SFunction left, String rightAlias, SFunction right) { - return join(Constant.LEFT_JOIN, clazz, table, alias, left, rightAlias, right); } @@ -236,7 +220,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件 */ default Children leftJoin(Class clazz, MConsumer> table, String alias, MFunction> function) { - return join(Constant.LEFT_JOIN, clazz, table, alias, function); } @@ -248,7 +231,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children leftJoin(Class clazz, MConsumer> table, String alias, SFunction left, SFunction right, MFunction ext) { - return join(Constant.LEFT_JOIN, clazz, table, alias, left, right, ext); } @@ -261,7 +243,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param consumer 条件 */ default Children leftJoin(Class clazz, MConsumer> table, String alias, BiConsumer, Children> consumer) { - return join(Constant.LEFT_JOIN, clazz, table, alias, consumer); } @@ -269,7 +250,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, SFunction left, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, left, right); } @@ -277,7 +257,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, left, rightAlias, right); } @@ -285,7 +264,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MFunction> function) { - return join(Constant.RIGHT_JOIN, clazz, function); } @@ -293,7 +271,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, SFunction left, SFunction right, MFunction ext) { - return join(Constant.RIGHT_JOIN, clazz, left, right, ext); } @@ -301,7 +278,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, BiConsumer, Children> consumer) { - return join(Constant.RIGHT_JOIN, clazz, consumer); } @@ -309,7 +285,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, String alias, SFunction left, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, alias, left, right); } @@ -317,7 +292,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, alias, left, rightAlias, right); } @@ -325,7 +299,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, String alias, MFunction> function) { - return join(Constant.RIGHT_JOIN, clazz, alias, function); } @@ -333,7 +306,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, String alias, SFunction left, SFunction right, MFunction ext) { - return join(Constant.RIGHT_JOIN, clazz, alias, left, right, ext); } @@ -341,7 +313,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, String alias, BiConsumer, Children> consumer) { - return join(Constant.RIGHT_JOIN, clazz, alias, consumer); } @@ -349,7 +320,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, SFunction left, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, table, left, right); } @@ -358,7 +328,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, SFunction left, String rightAlias, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, table, left, rightAlias, right); } @@ -366,7 +335,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, MFunction> function) { - return join(Constant.RIGHT_JOIN, clazz, table, function); } @@ -374,7 +342,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, SFunction left, SFunction right, MFunction ext) { - return join(Constant.RIGHT_JOIN, clazz, table, left, right, ext); } @@ -382,7 +349,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, BiConsumer, Children> consumer) { - return join(Constant.RIGHT_JOIN, clazz, table, consumer); } @@ -391,7 +357,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, String alias, SFunction left, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, table, alias, left, right); } @@ -399,7 +364,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, String alias, SFunction left, String rightAlias, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, table, alias, left, rightAlias, right); } @@ -407,7 +371,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, String alias, MFunction> function) { - return join(Constant.RIGHT_JOIN, clazz, table, alias, function); } @@ -415,7 +378,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, String alias, SFunction left, SFunction right, MFunction ext) { - return join(Constant.RIGHT_JOIN, clazz, table, alias, left, right, ext); } @@ -423,7 +385,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children rightJoin(Class clazz, MConsumer> table, String alias, BiConsumer, Children> consumer) { - return join(Constant.RIGHT_JOIN, clazz, table, alias, consumer); } @@ -431,7 +392,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, SFunction left, SFunction right) { - return join(Constant.INNER_JOIN, clazz, left, right); } @@ -439,7 +399,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { - return join(Constant.INNER_JOIN, clazz, left, rightAlias, right); } @@ -447,7 +406,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MFunction> function) { - return join(Constant.INNER_JOIN, clazz, function); } @@ -455,7 +413,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, SFunction left, SFunction right, MFunction ext) { - return join(Constant.INNER_JOIN, clazz, left, right, ext); } @@ -463,7 +420,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, BiConsumer, Children> consumer) { - return join(Constant.INNER_JOIN, clazz, consumer); } @@ -472,7 +428,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, String alias, SFunction left, SFunction right) { - return join(Constant.INNER_JOIN, clazz, alias, left, right); } @@ -480,7 +435,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { - return join(Constant.INNER_JOIN, clazz, alias, left, rightAlias, right); } @@ -488,7 +442,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, String alias, MFunction> function) { - return join(Constant.INNER_JOIN, clazz, alias, function); } @@ -496,7 +449,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, String alias, SFunction left, SFunction right, MFunction ext) { - return join(Constant.INNER_JOIN, clazz, alias, left, right, ext); } @@ -504,7 +456,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, String alias, BiConsumer, Children> consumer) { - return join(Constant.INNER_JOIN, clazz, alias, consumer); } @@ -512,7 +463,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, SFunction left, SFunction right) { - return join(Constant.INNER_JOIN, clazz, table, left, right); } @@ -520,7 +470,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, SFunction left, String rightAlias, SFunction right) { - return join(Constant.INNER_JOIN, clazz, table, left, rightAlias, right); } @@ -528,7 +477,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, MFunction> function) { - return join(Constant.INNER_JOIN, clazz, table, function); } @@ -536,7 +484,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, SFunction left, SFunction right, MFunction ext) { - return join(Constant.INNER_JOIN, clazz, table, left, right, ext); } @@ -544,7 +491,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, BiConsumer, Children> consumer) { - return join(Constant.INNER_JOIN, clazz, table, consumer); } @@ -553,7 +499,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, String alias, SFunction left, SFunction right) { - return join(Constant.INNER_JOIN, clazz, table, alias, left, right); } @@ -561,7 +506,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, String alias, SFunction left, String rightAlias, SFunction right) { - return join(Constant.INNER_JOIN, clazz, table, alias, left, rightAlias, right); } @@ -569,7 +513,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, String alias, MFunction> function) { - return join(Constant.INNER_JOIN, clazz, table, alias, function); } @@ -577,7 +520,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, String alias, SFunction left, SFunction right, MFunction ext) { - return join(Constant.INNER_JOIN, clazz, table, alias, left, right, ext); } @@ -585,7 +527,6 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, MConsumer> table, String alias, BiConsumer, Children> consumer) { - return join(Constant.INNER_JOIN, clazz, table, alias, consumer); } @@ -671,7 +612,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, SFunction left, SFunction right) { - return join(keyWord, clazz, null, null, (on, e) -> on.eq(left, right)); } @@ -686,7 +626,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, SFunction left, String rightAlias, SFunction right) { - return join(keyWord, clazz, null, null, (on, e) -> on.eq(left, rightAlias, right)); } @@ -699,7 +638,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件 */ default Children join(String keyWord, Class clazz, MFunction> function) { - return join(keyWord, clazz, null, null, (on, e) -> function.apply(on)); } @@ -711,7 +649,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children join(String keyWord, Class clazz, SFunction left, SFunction right, MFunction ext) { - return join(keyWord, clazz, null, null, (on, e) -> { on.eq(left, right); ext.apply(e); @@ -722,7 +659,6 @@ public interface QueryJoin extends MPJBaseJoin, String * 内部使用, 不建议直接调用 */ default Children join(String keyWord, Class clazz, BiConsumer, Children> consumer) { - return join(keyWord, clazz, null, null, consumer); } @@ -738,7 +674,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, String alias, SFunction left, SFunction right) { - return join(keyWord, clazz, null, alias, (on, e) -> on.eq(left, right)); } @@ -754,7 +689,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { - return join(keyWord, clazz, null, alias, (on, e) -> on.eq(left, rightAlias, right)); } @@ -767,7 +701,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件 */ default Children join(String keyWord, Class clazz, String alias, MFunction> function) { - return join(keyWord, clazz, null, alias, (on, e) -> function.apply(on)); } @@ -779,7 +712,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children join(String keyWord, Class clazz, String alias, SFunction left, SFunction right, MFunction ext) { - return join(keyWord, clazz, null, alias, (on, e) -> { on.eq(left, right); ext.apply(e); @@ -790,7 +722,6 @@ public interface QueryJoin extends MPJBaseJoin, String * 内部使用, 不建议直接调用 */ default Children join(String keyWord, Class clazz, String alias, BiConsumer, Children> consumer) { - return join(keyWord, clazz, null, alias, consumer); } @@ -806,7 +737,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, MConsumer> table, SFunction left, SFunction right) { - return join(keyWord, clazz, table, null, (on, e) -> on.eq(left, right)); } @@ -821,7 +751,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, MConsumer> table, SFunction left, String rightAlias, SFunction right) { - return join(keyWord, clazz, table, null, (on, e) -> on.eq(left, rightAlias, right)); } @@ -834,7 +763,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件 */ default Children join(String keyWord, Class clazz, MConsumer> table, MFunction> function) { - return join(keyWord, clazz, table, null, (on, e) -> function.apply(on)); } @@ -846,7 +774,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children join(String keyWord, Class clazz, MConsumer> table, SFunction left, SFunction right, MFunction ext) { - return join(keyWord, clazz, table, null, (on, e) -> { on.eq(left, right); ext.apply(e); @@ -857,7 +784,6 @@ public interface QueryJoin extends MPJBaseJoin, String * 内部使用, 不建议直接调用 */ default Children join(String keyWord, Class clazz, MConsumer> table, BiConsumer, Children> consumer) { - return join(keyWord, clazz, table, null, consumer); } @@ -873,7 +799,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, MConsumer> table, String alias, SFunction left, SFunction right) { - return join(keyWord, clazz, table, alias, (on, e) -> on.eq(left, right)); } @@ -889,7 +814,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 扩展 用于关联表的 select 和 where */ default Children join(String keyWord, Class clazz, MConsumer> table, String alias, SFunction left, String rightAlias, SFunction right) { - return join(keyWord, clazz, table, alias, (on, e) -> on.eq(left, rightAlias, right)); } @@ -902,7 +826,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param function 条件 */ default Children join(String keyWord, Class clazz, MConsumer> table, String alias, MFunction> function) { - return join(keyWord, clazz, table, alias, (on, e) -> function.apply(on)); } @@ -914,7 +837,6 @@ public interface QueryJoin extends MPJBaseJoin, String * @param right 条件 */ default Children join(String keyWord, Class clazz, MConsumer> table, String alias, SFunction left, SFunction right, MFunction ext) { - return join(keyWord, clazz, table, alias, (on, e) -> { on.eq(left, right); ext.apply(e); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Fun.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Fun.java index b398c56..ed930e8 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Fun.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Fun.java @@ -1,6 +1,8 @@ package com.github.yulichang.wrapper.segments; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.github.yulichang.wrapper.interfaces.MFunction; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,7 +22,12 @@ public class Fun implements SFunction { private final String alias; private final SFunction func; + private final boolean isSub; + private final Class clazz; + private final MFunction> sub; + @Override + public R apply(T t) { throw new UnsupportedOperationException(); } @@ -31,6 +38,15 @@ public class Fun implements SFunction { * 仅对selectFunc有效 */ public static Fun f(String alias, SFunction func) { - return new Fun<>(alias, func); + return new Fun<>(alias, func, false, null, null); + } + + /** + * 别名func + *

+ * 仅对selectFunc有效 + */ + public static Fun f(Class clazz, MFunction> func) { + return new Fun<>(null, null, true, clazz, func); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java index d97b794..e8b1083 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java @@ -4,6 +4,7 @@ package com.github.yulichang.wrapper.segments; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.wrapper.enums.BaseFuncEnum; +import com.github.yulichang.wrapper.interfaces.MFunction; import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.ibatis.type.JdbcType; @@ -72,12 +73,18 @@ public class SelectFunc implements Select { this.index = index; this.column = null; this.args = Arrays.stream(args).map(i -> { - boolean ins = i instanceof Fun; - if (ins) { + if (i instanceof Fun) { Fun f = (Fun) i; - return new Arg(LambdaUtils.getEntityClass(f.getFunc()), LambdaUtils.getName(f.getFunc()), true, f.getAlias(), null); + if (f.isSub()) { + //noinspection unchecked + return new Arg(f.getClazz(), null, false, null, null, true, (MFunction) ((Object) f.getSub())); + } else { + return new Arg(LambdaUtils.getEntityClass(f.getFunc()), LambdaUtils.getName(f.getFunc()), + true, f.getAlias(), null, false, null); + } } else { - return new Arg(LambdaUtils.getEntityClass(i), LambdaUtils.getName(i), false, null, null); + return new Arg(LambdaUtils.getEntityClass(i), LambdaUtils.getName(i), false, + null, null, false, null); } }).toArray(Arg[]::new); this.cache = null; @@ -170,5 +177,7 @@ public class SelectFunc implements Select { private final boolean hasTableAlias; private final String tableAlias; private final Object property; + private final boolean isSub; + private final MFunction subFunc; } } diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 8d3568e..3252b2b 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -22,8 +22,6 @@ test-join test-collection test-mapping - - test-kotlin @@ -49,7 +47,7 @@ - 1.5.1 + 1.5.2 3.5.8 17 diff --git a/mybatis-plus-join-test/test-join/pom.xml b/mybatis-plus-join-test/test-join/pom.xml index f097145..c4c2633 100644 --- a/mybatis-plus-join-test/test-join/pom.xml +++ b/mybatis-plus-join-test/test-join/pom.xml @@ -52,7 +52,6 @@ org.projectlombok lombok - 1.18.34 diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserDO.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserDO.java index cfdba99..04a9312 100644 --- a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserDO.java +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserDO.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import com.github.yulichang.annotation.DynamicTableName; import com.github.yulichang.annotation.Table; import com.github.yulichang.test.join.dto.UserJson; import com.github.yulichang.test.join.enums.Sex; @@ -23,7 +22,6 @@ import java.util.List; @ToString @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) -@DynamicTableName @FieldNameConstants @TableName(value = "`user`", autoResultMap = true) public class UserDO extends ID implements Serializable { diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/ConditionSubTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/ConditionSubTest.java new file mode 100644 index 0000000..c76f7e8 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/ConditionSubTest.java @@ -0,0 +1,247 @@ +package com.github.yulichang.test.join.unit; + +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.EnabledIfConfig; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.EnabledIf; + +@SpringBootTest +@EnabledIf(value = EnabledIfConfig.runWithExcludingOracle, loadContext = true) +public class ConditionSubTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + /** + * select 子查询 + */ + @Test + void conditionSub() { + ThreadLocalUtils.set(""" + SELECT + t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id >= ? AND t.id <= ? AND + t.id = (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id AND st.id >= ? AND st.id <= ?)) + AND t.id >= ? AND t.id <= ?) + """); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll() + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .ge(UserDO::getId, -2) + .le(UserDO::getId, 102) + .eq(UserDO::getId, UserDO.class, w -> w + .select(UserDO::getId) + .eq(UserDO::getId, UserDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)) + .ge(UserDO::getId, -1) + .le(UserDO::getId, 101); + + wrapper.list(); + + ThreadLocalUtils.set(""" + SELECT + t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id = (SELECT sst.id FROM `user` sst WHERE sst.del = false AND (sst.id = t.id AND sst.id >= ? AND sst.id <= ?))) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll() + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .eq(UserDO::getId, UserDO.class, w -> w + .setAlias("sst") + .select(UserDO::getId) + .eq(UserDO::getId, UserDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)); + wrapper1.list(); + } + + @Test + void conditionSubIn() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id >= ? AND t.id <= ? AND + t.id IN (SELECT t.id FROM `user` t WHERE t.del = false AND (t.id >= ? AND t.id <= ?)) AND t.id >= ? AND + t.id <= ?) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll() + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .ge(UserDO::getId, -2) + .le(UserDO::getId, 102) + .in(UserDO::getId, UserDO.class, u -> u + .select(UserDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)) + .ge(UserDO::getId, -1) + .le(UserDO::getId, 101); + wrapper1.list(); + } + + @Test + void conditionSubExists() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id >= ? AND t.id <= ? AND + EXISTS (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id >= ? AND st.id <= ?)) AND t.id >= ? AND + t.id <= ?) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll() + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .ge(UserDO::getId, -2) + .le(UserDO::getId, 102) + .exists(UserDO.class, u -> u + .select(UserDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)) + .ge(UserDO::getId, -1) + .le(UserDO::getId, 101); + wrapper1.list(); + } + + @Test + void conditionSubHaving() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id >= ? AND t.id <= ? AND + NOT EXISTS (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id >= ? AND st.id <= ?)) AND t.id >= ? AND + t.id <= ?) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll() + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .ge(UserDO::getId, -2) + .le(UserDO::getId, 102) + .notExists(UserDO.class, h -> h + .select(UserDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)) + .ge(UserDO::getId, -1) + .le(UserDO::getId, 101); + wrapper1.list(); + } + + @Test + void conditionSubEQ() { + ThreadLocalUtils.set(""" + SELECT t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id >= ? AND t.id <= ? AND + t.id = (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t1.id AND st.id >= ? AND st.id <= ?)) AND + t.id >= ? AND t.id <= ?) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll() + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .ge(UserDO::getId, -2) + .le(UserDO::getId, 102) + .eq(UserDO::getId, UserDO.class, u -> u + .select(UserDO::getId) + .eq(UserDO::getId, AddressDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)) + .ge(UserDO::getId, -1) + .le(UserDO::getId, 101); + wrapper1.list(); + } +} diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/FromTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/FromTest.java new file mode 100644 index 0000000..5cf7bf9 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/FromTest.java @@ -0,0 +1,46 @@ +package com.github.yulichang.test.join.unit; + +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.EnabledIfConfig; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.EnabledIf; + +@SpringBootTest +@EnabledIf(value = EnabledIfConfig.runWithExcludingOracle, loadContext = true) +public class FromTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + /** + * select 子查询 + */ + @Test + void from() { + ThreadLocalUtils.set(""" + SELECT + t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, + t.address_id, t.address_id2, t.del, t.create_by, t.update_by + FROM (SELECT + t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, + t.address_id, t.address_id2, t.del, t.create_by, t.update_by + FROM `user` t WHERE t.del = false AND (t.id >= ?)) t + WHERE t.del = false + """); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll() + .from(from -> from + .selectAll() + .ge(UserDO::getId, 0)); + wrapper.list(); + } +} diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectFuncTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectFuncTest.java index 6c60fd5..a047d81 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectFuncTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectFuncTest.java @@ -6,6 +6,8 @@ import com.github.yulichang.test.join.entity.UserDO; import com.github.yulichang.test.util.Reset; import com.github.yulichang.test.util.ThreadLocalUtils; import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.github.yulichang.wrapper.segments.Fun; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -47,4 +49,43 @@ public class SelectFuncTest { list.forEach(System.out::println); } + @Test + void applyFunc1() { + ThreadLocalUtils.set(""" + SELECT + t.id, + t.pid, + t.`name`, + t.`json`, + t.sex, + t.head_img, + t.create_time, + t.address_id, + t.address_id2, + t.del, + t.create_by, + t.update_by, + (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id)) AS address + FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id = (SELECT sst.id FROM `user` sst WHERE sst.del = false AND (sst.id = t.id AND sst.id >= ? AND sst.id <= ?))) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll() + .selectFunc("%s", arg -> arg.accept( + Fun.f(UserDO.class, u -> u + .select(UserDO::getId) + .eq(UserDO::getId, UserDO::getId))), + UserDTO::getAddress) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .eq(UserDO::getId, UserDO.class, w -> w + .setAlias("sst") + .select(UserDO::getId) + .eq(UserDO::getId, UserDO::getId) + .ge(UserDO::getId, 0) + .le(UserDO::getId, 100)); + wrapper1.list(UserDTO.class); + } + } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectSubTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectSubTest.java index 28b7208..874442b 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectSubTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/SelectSubTest.java @@ -66,14 +66,26 @@ public class SelectSubTest { .le(UserDO::getId, 100); wrapper.list(); -// ThreadLocalUtils.set("SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = t1.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); -// MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) -// .selectSub(AreaDO.class, w -> w.select(AreaDO::getId) -// .eq(AreaDO::getId, AddressDO::getId) -// .last("limit 1"), UserDO::getId) -// .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) -// .le(UserDO::getId, 100); -// wrapper1.list(); + ThreadLocalUtils.set(""" + SELECT + (SELECT + st.id + FROM area st + WHERE st.del = false + AND (st.id = t1.id) LIMIT 1) AS id + FROM `user` t + LEFT JOIN address t1 ON (t1.user_id = t.id) + WHERE t.del = false + AND t1.del = false + AND (t.id <= ?) + """); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectSub(AreaDO.class, w -> w.select(AreaDO::getId) + .eq(AreaDO::getId, AddressDO::getId) + .last("limit 1"), UserDO::getId) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .le(UserDO::getId, 100); + wrapper1.list(); } @Test diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/UnionTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/UnionTest.java index bf2b1d6..bc997eb 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/UnionTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/unit/UnionTest.java @@ -23,7 +23,7 @@ public class UnionTest { @Test - void unionAll1() { + void unionAll() { ThreadLocalUtils.set(""" SELECT t.id @@ -31,12 +31,12 @@ public class UnionTest { WHERE t.del = false AND (t.id = ?) UNION ALL - SELECT + (SELECT t.id FROM address t - WHERE (t.id = ?) + WHERE (t.id = ?)) UNION ALL - SELECT + (SELECT (SELECT st.id FROM area st @@ -44,7 +44,7 @@ public class UnionTest { AND (st.id = ? AND (st.id = ?))) AS id FROM area t WHERE t.del = false - AND (t.id = ? AND (t.id = ?)) + AND (t.id = ? AND (t.id = ?))) """); MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) .select(UserDO::getId) diff --git a/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt index 73f428c..018a0b8 100644 --- a/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt +++ b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt @@ -4,14 +4,12 @@ import com.baomidou.mybatisplus.annotation.TableField import com.baomidou.mybatisplus.annotation.TableLogic import com.baomidou.mybatisplus.annotation.TableName import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler -import com.github.yulichang.annotation.DynamicTableName import com.github.yulichang.test.kt.enums.Sex import lombok.experimental.FieldNameConstants import java.io.Serializable import java.time.LocalDateTime @Suppress("unused") -@DynamicTableName @FieldNameConstants @TableName(value = "`user`", autoResultMap = true) open class UserDO : ID(), Serializable { diff --git a/pom.xml b/pom.xml index d80e78c..a80b187 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ - 1.5.1 + 1.5.2 3.5.9 17