From ad1360e3c6179f25274db111b5278bf4d31e9820 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 9 Dec 2022 18:16:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E8=BF=9E=E6=8E=A5=E5=92=8C=E5=85=B3?= =?UTF-8?q?=E8=81=94=E5=90=8C=E4=B8=80=E5=BC=A0=E8=A1=A8N=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/interceptor/MPJInterceptor.java | 2 +- .../wrapper/MPJAbstractLambdaWrapper.java | 122 ++++++++++++++---- .../yulichang/wrapper/MPJAbstractWrapper.java | 89 +++++-------- .../yulichang/wrapper/MPJLambdaWrapper.java | 29 +++-- .../yulichang/wrapper/interfaces/Query.java | 29 +++-- .../wrapper/interfaces/QueryJoin.java | 120 +++++++++++++++-- .../wrapper/interfaces/QueryLabel.java | 35 ++++- .../wrapper/interfaces/on/OnCompare.java | 36 ------ .../{OnFunction.java => WrapperFunction.java} | 2 +- .../wrapper/resultmap/MybatisLabel.java | 50 +++++-- .../wrapper/segments/SelectCache.java | 2 +- .../yulichang/test/join/entity/UserDO.java | 3 + .../test-join/src/main/resources/db/data.sql | 45 +++---- .../test/join/LambdaWrapperTest.java | 26 ++-- 14 files changed, 385 insertions(+), 205 deletions(-) rename mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/{OnFunction.java => WrapperFunction.java} (87%) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java index f12cb5b..386273b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java @@ -186,7 +186,7 @@ public class MPJInterceptor implements Interceptor { } } else { Field field = fieldMap.get(i.getColumProperty()); - columnSet.add(i.getColumProperty()); + columnSet.add(i.getTagColumn()); if (Objects.nonNull(field)) { ResultMapping.Builder builder = new ResultMapping.Builder(ms.getConfiguration(), i.getColumProperty(), i.getTagColumn(), field.getType()); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java index c508990..fb371cc 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java @@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.Constant; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.support.ColumnCache; +import com.github.yulichang.wrapper.segments.Select; import com.github.yulichang.wrapper.segments.SelectCache; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; import java.util.*; import java.util.stream.Stream; @@ -28,27 +28,22 @@ public abstract class MPJAbstractLambdaWrapper String columnToString(X column, boolean isJoin) { - return columnToString((SFunction) column, isJoin); + protected String columnToString(String index, X column, boolean isJoin) { + return columnToString(index, (SFunction) column, isJoin); } @Override @SafeVarargs - protected final String columnsToString(boolean isJoin, X... columns) { - return Arrays.stream(columns).map(i -> columnToString((SFunction) i, isJoin)).collect(joining(StringPool.COMMA)); + protected final String columnsToString(String index, boolean isJoin, X... columns) { + return Arrays.stream(columns).map(i -> columnToString(index, (SFunction) i, isJoin)).collect(joining(StringPool.COMMA)); } - protected String columnToString(SFunction column, boolean isJoin) { + protected String columnToString(String index, SFunction column, boolean isJoin) { Class entityClass = LambdaUtils.getEntityClass(column); - return Constant.TABLE_ALIAS + getDefault(entityClass, isJoin) + StringPool.DOT + + return Constant.TABLE_ALIAS + getDefault(index, entityClass, isJoin) + StringPool.DOT + getCache(column).getTagColumn(); } @@ -58,26 +53,42 @@ public abstract class MPJAbstractLambdaWrapper clazz, boolean isJoin) { + protected String getDefault(String index, Class clazz, boolean isJoin) { + if (Objects.isNull(index)) { + if (Objects.equals(clazz, getEntityClass())) { + return StringPool.EMPTY; + } + //正序 + Table table = tableList.getPositive(clazz); + return Objects.isNull(table.index) ? StringPool.EMPTY : table.index; + } Table table = tableList.get(clazz, index); if (Objects.nonNull(table.getIndex())) { - if (getEntityClass() == null) { - return table.getIndex(); - } - if (isJoin && joinClass == getEntityClass()) { - return StringPool.EMPTY; + if (isJoin) { + //除自己以外的倒序第一个 + Table t = tableList.getOrElse(clazz, index); + if (Objects.isNull(t.getIndex())) { + return StringPool.EMPTY; + } + return t.getIndex(); } return table.getIndex(); } return StringPool.EMPTY; } - protected String getDefaultSelect(Class clazz, boolean myself) { + protected String getDefaultSelect(String index, Class clazz, Select s) { + if (s.isLabel()) { + if (Objects.nonNull(s.getIndex())) { + return s.getIndex(); + } else { + Table table = tableList.get(s.getClazz()); + return Objects.isNull(table.index) ? StringPool.EMPTY : table.index; + } + } + //外层select Table table = tableList.get(clazz, index); if (Objects.nonNull(table.getIndex())) { - if (myself) { - return StringPool.EMPTY; - } return table.getIndex(); } return StringPool.EMPTY; @@ -85,7 +96,7 @@ public abstract class MPJAbstractLambdaWrapper list = new ArrayList<>(); @@ -93,8 +104,12 @@ public abstract class MPJAbstractLambdaWrapper clazz) { - for (Table t : list) { + public Table get(Class clazz) { + if (list.isEmpty()) { + return DEFAULT_TABLE; + } + for (int i = list.size() - 1; i >= 0; i--) { + Table t = list.get(i); if (clazz == t.clazz) { return t; } @@ -102,15 +117,49 @@ public abstract class MPJAbstractLambdaWrapper clazz, String index) { if (Objects.isNull(index)) { return get(clazz); } + if (list.isEmpty()) { + return DEFAULT_TABLE; + } + //倒序 + for (int i = list.size() - 1; i >= 0; i--) { + Table t = list.get(i); + if (clazz == t.clazz && Objects.equals(index, t.getIndex())) { + return t; + } + } + return get(clazz); + } + + @SuppressWarnings("unused") + public Table getPositive(Class clazz, String index) { + if (Objects.isNull(index)) { + return get(clazz); + } + if (list.isEmpty()) { + return DEFAULT_TABLE; + } for (Table t : list) { if (clazz == t.clazz && Objects.equals(index, t.getIndex())) { return t; } } + return getPositive(clazz); + } + + public Table getPositive(Class clazz) { + if (list.isEmpty()) { + return DEFAULT_TABLE; + } + for (Table t : list) { + if (clazz == t.clazz) { + return t; + } + } return DEFAULT_TABLE; } @@ -125,14 +174,33 @@ public abstract class MPJAbstractLambdaWrapper clazz, String index) { + if (Objects.isNull(index)) { + return get(clazz); + } + //倒序 + for (int i = list.size() - 1; i >= 0; i--) { + Table t = list.get(i); + if (clazz == t.clazz) { + if (Objects.equals(index, t.getIndex())) { + continue; + } + if (Integer.parseInt(t.getIndex()) < Integer.parseInt(index)) { + return t; + } + } + } + return DEFAULT_TABLE; + } } @Data @EqualsAndHashCode @AllArgsConstructor public static class Table { - private Class clazz; + private final Class clazz; - private String index; + private final String index; } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index 9ba6e58..202b08e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -41,6 +41,11 @@ public abstract class MPJAbstractWrapper Children between(boolean condition, SFunction column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), BETWEEN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @Override public Children notBetween(boolean condition, SFunction column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_BETWEEN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @@ -269,43 +274,43 @@ public abstract class MPJAbstractWrapper Children isNull(boolean condition, SFunction column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), IS_NULL)); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NULL)); } @Override public Children isNotNull(boolean condition, SFunction column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), IS_NOT_NULL)); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NOT_NULL)); } @Override public Children in(boolean condition, SFunction column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), IN, inExpression(coll))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(coll))); } @Override public Children in(boolean condition, SFunction column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), IN, inExpression(values))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(values))); } @Override public Children notIn(boolean condition, SFunction column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_IN, inExpression(coll))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(coll))); } @Override public Children notIn(boolean condition, SFunction column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_IN, inExpression(values))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(values))); } @Override public Children inSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), IN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, () -> String.format("(%s)", inValue))); } @Override public Children notInSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_IN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, () -> String.format("(%s)", inValue))); } @@ -313,7 +318,7 @@ public abstract class MPJAbstractWrapper Children groupBy(boolean condition, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { - String one = (StringPool.COMMA + columnsToString(false, columns)); + String one = (StringPool.COMMA + columnsToString(index, false, columns)); final String finalOne = one; appendSqlSegments(GROUP_BY, () -> finalOne); } @@ -323,9 +328,9 @@ public abstract class MPJAbstractWrapper Children groupBy(boolean condition, SFunction column, SFunction... columns) { return maybeDo(condition, () -> { - String one = columnToString(column, false); + String one = columnToString(index, column, false); if (ArrayUtils.isNotEmpty(columns)) { - one += (StringPool.COMMA + columnsToString(false, columns)); + one += (StringPool.COMMA + columnsToString(index, false, columns)); } final String finalOne = one; appendSqlSegments(GROUP_BY, () -> finalOne); @@ -338,7 +343,7 @@ public abstract class MPJAbstractWrapper appendSqlSegments(ORDER_BY, - columnToSqlSegment(columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); } }); } @@ -349,7 +354,7 @@ public abstract class MPJAbstractWrapper appendSqlSegments(ORDER_BY, - columnToSqlSegment(columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); } }); } @@ -358,10 +363,10 @@ public abstract class MPJAbstractWrapper Children orderBy(boolean condition, boolean isAsc, SFunction column, SFunction... columns) { return maybeDo(condition, () -> { final SqlKeyword mode = isAsc ? ASC : DESC; - appendSqlSegments(ORDER_BY, columnToSqlSegment(column, false), mode); + appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column, false), mode); if (ArrayUtils.isNotEmpty(columns)) { Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); } }); } @@ -408,7 +413,7 @@ public abstract class MPJAbstractWrapper拼接 LIKE 以及 值

*/ protected Children likeValue(boolean condition, SqlKeyword keyword, SFunction column, Object val, SqlLike sqlLike) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), keyword, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), keyword, () -> formatParam(null, SqlUtils.concatLike(val, sqlLike)))); } @@ -421,13 +426,13 @@ public abstract class MPJAbstractWrapper Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, Object val) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, true), sqlKeyword, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword, () -> formatParam(null, val))); } protected Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, SFunction val) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), sqlKeyword, - columnToSqlSegment(val, true))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword, + columnToSqlSegment(index, val, true))); } /** @@ -609,14 +614,14 @@ public abstract class MPJAbstractWrapper ISqlSegment columnToSqlSegment(SFunction column, boolean isJoin) { - return () -> columnToString(column, isJoin); + protected final ISqlSegment columnToSqlSegment(String index, SFunction column, boolean isJoin) { + return () -> columnToString(index, column, isJoin); } /** * 获取 columnName */ - protected String columnToString(X column, boolean isJoin) { + protected String columnToString(String index, X column, boolean isJoin) { return (String) column; } @@ -625,8 +630,8 @@ public abstract class MPJAbstractWrapper String columnsToString(boolean isJoin, X... columns) { - return Arrays.stream(columns).map(i -> this.columnToString(i, isJoin)).collect(joining(StringPool.COMMA)); + protected String columnsToString(String index, boolean isJoin, X... columns) { + return Arrays.stream(columns).map(i -> this.columnToString(index, i, isJoin)).collect(joining(StringPool.COMMA)); } @Override @@ -675,36 +680,4 @@ public abstract class MPJAbstractWrapper Children le(boolean condition, SFunction column, SFunction val) { return addCondition(condition, column, LE, val); } - - @Override - public Children between(boolean condition, SFunction column, SFunction val1, SFunction val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), BETWEEN, - columnToSqlSegment(val1, true), AND, columnToSqlSegment(val2, true))); - } - - public Children between(boolean condition, SFunction column, Object val1, SFunction val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), BETWEEN, - () -> formatParam(null, val1), AND, columnToSqlSegment(val2, true))); - } - - public Children between(boolean condition, SFunction column, SFunction val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), BETWEEN, - columnToSqlSegment(val1, true), AND, () -> formatParam(null, val2))); - } - - @Override - public Children notBetween(boolean condition, SFunction column, SFunction val1, SFunction val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_BETWEEN, - columnToSqlSegment(val1, true), AND, columnToSqlSegment(val2, true))); - } - - public Children notBetween(boolean condition, SFunction column, Object val1, SFunction val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_BETWEEN, - () -> formatParam(null, val1), AND, columnToSqlSegment(val2, true))); - } - - public Children notBetween(boolean condition, SFunction column, SFunction val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, false), NOT_BETWEEN, - columnToSqlSegment(val1, true), AND, () -> formatParam(null, val2))); - } } 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 5832ef4..10c0c22 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 @@ -17,7 +17,7 @@ import com.github.yulichang.toolkit.support.ColumnCache; import com.github.yulichang.wrapper.interfaces.Query; import com.github.yulichang.wrapper.interfaces.QueryJoin; import com.github.yulichang.wrapper.interfaces.QueryLabel; -import com.github.yulichang.wrapper.interfaces.on.OnFunction; +import com.github.yulichang.wrapper.interfaces.on.WrapperFunction; import com.github.yulichang.wrapper.resultmap.MybatisLabel; import com.github.yulichang.wrapper.segments.Select; import com.github.yulichang.wrapper.segments.SelectCache; @@ -27,6 +27,7 @@ import lombok.Getter; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -104,7 +105,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - TableList tableList, String keyWord, Class joinClass) { + TableList tableList, String index, String keyWord, Class joinClass) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -115,6 +116,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper { - String str = Constant.TABLE_ALIAS + getDefaultSelect(i.getClazz(), (i.getClazz() == getEntityClass() && !i.isLabel())) + StringPool.DOT + i.getColumn(); + String str = Constant.TABLE_ALIAS + getDefaultSelect(i.getIndex(), i.getClazz(), i) + StringPool.DOT + i.getColumn(); return i.isFunc() ? (String.format(i.getFunc().getSql(), str) + Constant.AS + i.getAlias()) : (i.isHasAlias() ? (str + Constant.AS + i.getAlias()) : str); }).collect(Collectors.joining(StringPool.COMMA)); sqlSelect.setStringValue(s); @@ -216,13 +218,13 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper instance() { - return instance(null, null); + return instance(index, null, null); } - protected MPJLambdaWrapper instance(String keyWord, Class joinClass) { + protected MPJLambdaWrapper instance(String index, String keyWord, Class joinClass) { return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - this.tableList, keyWord, joinClass); + this.tableList, index, keyWord, joinClass); } @Override @@ -285,12 +287,21 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper join(String keyWord, Class clazz, OnFunction function) { - MPJLambdaWrapper apply = function.apply(instance(keyWord, clazz)); - tableList.add(clazz, String.valueOf(tableIndex)); + public MPJLambdaWrapper join(String keyWord, Class clazz, WrapperFunction function, WrapperFunction ext) { + String name = String.valueOf(tableIndex); + MPJLambdaWrapper apply = function.apply(instance(name, keyWord, clazz)); + tableList.add(clazz, name); onWrappers.add(apply); tableIndex++; + if (Objects.nonNull(ext)) { + this.index = name; + MPJLambdaWrapper wrapper = ext.apply(typedThis); + wrapper.index = null; + } return typedThis; } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index 94f9b8a..5c82594 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -91,10 +91,26 @@ public interface Query extends Serializable { default Children selectAs(SFunction column, String alias) { Class aClass = LambdaUtils.getEntityClass(column); Map cacheMap = ColumnCache.getMapField(aClass); + String index = getIndex(); getSelectColum().add(new SelectAlias(cacheMap.get(LambdaUtils.getName(column)), getIndex(), alias)); return getChildren(); } + + /** + * 查询实体类全部字段 + */ + default Children selectAll(Class clazz) { + getSelectColum().addAll(ColumnCache.getListField(clazz).stream().map(i -> + new SelectNormal(i, getIndex())).collect(Collectors.toList())); + return getChildren(); + } + + /** + * select sql 片段 + */ + String getSqlSelect(); + /** * 聚合函数查询 *

@@ -131,19 +147,6 @@ public interface Query extends Serializable { return selectFunc(funcEnum, column, LambdaUtils.getName(alias)); } - /** - * 查询实体类全部字段 - */ - default Children selectAll(Class clazz) { - getSelectColum().addAll(ColumnCache.getListField(clazz).stream().map(i -> - new SelectNormal(i, getIndex())).collect(Collectors.toList())); - return getChildren(); - } - - /** - * select sql 片段 - */ - String getSqlSelect(); /* 默认聚合函数扩展 */ 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 b5d1aec..b3760de 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 @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.toolkit.Constant; import com.github.yulichang.toolkit.LambdaUtils; -import com.github.yulichang.wrapper.interfaces.on.OnFunction; +import com.github.yulichang.wrapper.interfaces.on.WrapperFunction; /** * @author yulichang @@ -41,8 +41,41 @@ public interface QueryJoin extends MPJBaseJoin { * @param clazz 关联实体类 * @param function 条件 */ - default Children leftJoin(Class clazz, OnFunction function) { - return join(Constant.LEFT_JOIN, clazz, function); + default Children leftJoin(Class clazz, WrapperFunction function) { + return join(Constant.LEFT_JOIN, clazz, function, null); + } + + /** + * left join + * + * @param clazz 关联的实体类 + * @param left 条件 + * @param right 条件 + */ + default Children leftJoin(Class clazz, SFunction left, SFunction right, WrapperFunction ext) { + return leftJoin(clazz, on -> on.eq(left, right), ext); + } + + /** + * left join + * + * @param left 条件 + * @param right 条件 + */ + default Children leftJoin(SFunction left, SFunction right, WrapperFunction ext) { + return leftJoin(LambdaUtils.getEntityClass(left), on -> on.eq(left, right), ext); + } + + /** + * left join 多条件 + *

+ * 例 leftJoin(UserDO.class, on -> on.eq(UserDO::getId,UserAddressDO::getUserId).le().gt()...) + * + * @param clazz 关联实体类 + * @param function 条件 + */ + default Children leftJoin(Class clazz, WrapperFunction function, WrapperFunction ext) { + return join(Constant.LEFT_JOIN, clazz, function, ext); } /** @@ -62,8 +95,29 @@ public interface QueryJoin extends MPJBaseJoin { /** * ignore 参考 left join */ - default Children rightJoin(Class clazz, OnFunction function) { - return join(Constant.RIGHT_JOIN, clazz, function); + default Children rightJoin(Class clazz, WrapperFunction function) { + return join(Constant.RIGHT_JOIN, clazz, function, null); + } + + /** + * ignore 参考 left join + */ + default Children rightJoin(Class clazz, SFunction left, SFunction right, WrapperFunction ext) { + return rightJoin(clazz, on -> on.eq(left, right), ext); + } + + /** + * ignore 参考 left join + */ + default Children rightJoin(SFunction left, SFunction right, WrapperFunction ext) { + return rightJoin(LambdaUtils.getEntityClass(left), on -> on.eq(left, right), ext); + } + + /** + * ignore 参考 left join + */ + default Children rightJoin(Class clazz, WrapperFunction function, WrapperFunction ext) { + return join(Constant.RIGHT_JOIN, clazz, function, ext); } /** @@ -83,8 +137,29 @@ public interface QueryJoin extends MPJBaseJoin { /** * ignore 参考 left join */ - default Children innerJoin(Class clazz, OnFunction function) { - return join(Constant.INNER_JOIN, clazz, function); + default Children innerJoin(Class clazz, WrapperFunction function) { + return join(Constant.INNER_JOIN, clazz, function, null); + } + + /** + * ignore 参考 left join + */ + default Children innerJoin(Class clazz, SFunction left, SFunction right, WrapperFunction ext) { + return innerJoin(clazz, on -> on.eq(left, right), ext); + } + + /** + * ignore 参考 left join + */ + default Children innerJoin(SFunction left, SFunction right, WrapperFunction ext) { + return innerJoin(LambdaUtils.getEntityClass(left), on -> on.eq(left, right), ext); + } + + /** + * ignore 参考 left join + */ + default Children innerJoin(Class clazz, WrapperFunction function, WrapperFunction ext) { + return join(Constant.INNER_JOIN, clazz, function, ext); } @@ -105,16 +180,41 @@ public interface QueryJoin extends MPJBaseJoin { /** * ignore 参考 left join */ - default Children fullJoin(Class clazz, OnFunction function) { - return join(Constant.FULL_JOIN, clazz, function); + default Children fullJoin(Class clazz, WrapperFunction function) { + return join(Constant.FULL_JOIN, clazz, function, null); } /** + * ignore 参考 left join + */ + default Children fullJoin(Class clazz, SFunction left, SFunction right, WrapperFunction ext) { + return fullJoin(clazz, on -> on.eq(left, right), ext); + } + + /** + * ignore 参考 left join + */ + default Children fullJoin(SFunction left, SFunction right, WrapperFunction ext) { + return fullJoin(LambdaUtils.getEntityClass(left), on -> on.eq(left, right), ext); + } + + /** + * ignore 参考 left join + */ + default Children fullJoin(Class clazz, WrapperFunction function, WrapperFunction ext) { + return join(Constant.FULL_JOIN, clazz, function, ext); + } + + + /** + * 调用此方法 keyword 前后需要带空格 比如 " LEFT JOIN " " RIGHT JOIN " + *

* 查询基类 可以直接调用此方法实现以上所有功能 * * @param keyWord 连表关键字 * @param clazz 连表实体类 * @param function 关联条件 + * @param ext 扩展 用于关联表的 select 和 where */ - Children join(String keyWord, Class clazz, OnFunction function); + Children join(String keyWord, Class clazz, WrapperFunction function, WrapperFunction ext); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java index 70d4b4c..3b86af0 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java @@ -10,6 +10,7 @@ import com.github.yulichang.wrapper.resultmap.MybatisLabel; import java.lang.reflect.Field; import java.util.Collection; import java.util.Map; +import java.util.Objects; @SuppressWarnings({"unchecked", "unused"}) public interface QueryLabel { @@ -42,18 +43,23 @@ public interface QueryLabel { * @param 包装类集合字段泛型 */ default > Children selectCollection(Class child, SFunction dtoField) { + return selectCollection(null, child, dtoField); + } + + default > Children selectCollection(Integer index, Class child, SFunction dtoField) { String dtoFieldName = LambdaUtils.getName(dtoField); Class dtoClass = LambdaUtils.getEntityClass(dtoField); Map fieldMap = MPJReflectionKit.getFieldMap(dtoClass); Field field = fieldMap.get(dtoFieldName); Class genericType = MPJReflectionKit.getGenericType(field); MybatisLabel.Builder builder; + String s = Objects.isNull(index) ? null : index.toString(); if (genericType == null || genericType.isAssignableFrom(child)) { //找不到集合泛型 List List List , 直接查询数据库实体 - builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType()); + builder = new MybatisLabel.Builder<>(s, dtoFieldName, child, field.getType()); } else { Class ofType = (Class) genericType; - builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType(), ofType, true); + builder = new MybatisLabel.Builder<>(s, dtoFieldName, child, field.getType(), ofType, true); } addLabel(builder.build()); return getChildren(); @@ -90,13 +96,21 @@ public interface QueryLabel { default > Children selectCollection(Class child, SFunction dtoField, MFunc> collection) { + return selectCollection(null, child, dtoField, collection); + } + + default > Children selectCollection(Integer index, + Class child, + SFunction dtoField, + MFunc> collection) { String dtoFieldName = LambdaUtils.getName(dtoField); Class dtoClass = LambdaUtils.getEntityClass(dtoField); Field field = MPJReflectionKit.getFieldMap(dtoClass).get(dtoFieldName); //获取集合泛型 Class genericType = MPJReflectionKit.getGenericType(field); Class ofType = (Class) genericType; - MybatisLabel.Builder builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType(), ofType, false); + MybatisLabel.Builder builder = new MybatisLabel.Builder<>(Objects.isNull(index) ? null : index.toString(), + dtoFieldName, child, field.getType(), ofType, false); MybatisLabel.Builder czBuilder = collection.apply(builder); addLabel(czBuilder.build()); return getChildren(); @@ -108,13 +122,18 @@ public interface QueryLabel { * @since 1.3.0 */ default Children selectAssociation(Class child, SFunction dtoField) { + return selectAssociation(null, child, dtoField); + } + + default Children selectAssociation(Integer index, Class child, SFunction dtoField) { String dtoFieldName = LambdaUtils.getName(dtoField); Class dtoClass = LambdaUtils.getEntityClass(dtoField); Map fieldMap = MPJReflectionKit.getFieldMap(dtoClass); Field field = fieldMap.get(dtoFieldName); Assert.isFalse(Collection.class.isAssignableFrom(field.getType()), "association 不支持集合类"); MybatisLabel.Builder builder; - builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType(), (Class) field.getType(), true); + builder = new MybatisLabel.Builder<>(Objects.isNull(index) ? null : index.toString(), + dtoFieldName, child, field.getType(), (Class) field.getType(), true); addLabel(builder.build()); return getChildren(); } @@ -126,11 +145,17 @@ public interface QueryLabel { */ default Children selectAssociation(Class child, SFunction dtoField, MFunc> collection) { + return selectAssociation(null, child, dtoField, collection); + } + + default Children selectAssociation(Integer index, Class child, SFunction dtoField, + MFunc> collection) { String dtoFieldName = LambdaUtils.getName(dtoField); Class dtoClass = LambdaUtils.getEntityClass(dtoField); Field field = MPJReflectionKit.getFieldMap(dtoClass).get(dtoFieldName); Assert.isFalse(Collection.class.isAssignableFrom(field.getType()), "association 不支持集合类"); - MybatisLabel.Builder builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType(), (Class) child, false); + MybatisLabel.Builder builder = new MybatisLabel.Builder<>(Objects.isNull(index) ? null : index.toString(), + dtoFieldName, child, field.getType(), (Class) child, false); MybatisLabel.Builder cfBuilder = collection.apply(builder); addLabel(cfBuilder.build()); return getChildren(); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java index 00d6166..0113cb7 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java @@ -115,40 +115,4 @@ public interface OnCompare extends Serializable { * @return children */ Children le(boolean condition, SFunction column, SFunction val); - - /** - * ignore - */ - default Children between(SFunction column, SFunction val1, SFunction val2) { - return between(true, column, val1, val2); - } - - /** - * BETWEEN 值1 AND 值2 - * - * @param condition 执行条件 - * @param column 字段 - * @param val1 值1 - * @param val2 值2 - * @return children - */ - Children between(boolean condition, SFunction column, SFunction val1, SFunction val2); - - /** - * ignore - */ - default Children notBetween(SFunction column, SFunction val1, SFunction val2) { - return notBetween(true, column, val1, val2); - } - - /** - * NOT BETWEEN 值1 AND 值2 - * - * @param condition 执行条件 - * @param column 字段 - * @param val1 值1 - * @param val2 值2 - * @return children - */ - Children notBetween(boolean condition, SFunction column, SFunction val1, SFunction val2); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/WrapperFunction.java similarity index 87% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java rename to mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/WrapperFunction.java index 4a30159..0679d71 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/on/WrapperFunction.java @@ -9,7 +9,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; * @since 1.1.8 */ @FunctionalInterface -public interface OnFunction { +public interface WrapperFunction { MPJLambdaWrapper apply(MPJLambdaWrapper wrapper); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/resultmap/MybatisLabel.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/resultmap/MybatisLabel.java index 7adde86..240eec2 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/resultmap/MybatisLabel.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/resultmap/MybatisLabel.java @@ -24,7 +24,7 @@ import java.util.stream.Collectors; @Getter public class MybatisLabel { - private final String index = null; + private String index; private String property; @@ -53,9 +53,10 @@ public class MybatisLabel { * 自动构建 */ @SuppressWarnings("unchecked") - public Builder(String property, Class entityClass, Class javaType) { + public Builder(String index, String property, Class entityClass, Class javaType) { this.mybatisLabel = new MybatisLabel<>(); mybatisLabel.property = property; + mybatisLabel.index = index; mybatisLabel.entityClass = entityClass; mybatisLabel.javaType = javaType; mybatisLabel.ofType = (Class) entityClass; @@ -73,9 +74,10 @@ public class MybatisLabel { * @param ofType 映射类 * @param auto 自动映射数据库实体对应的字段 */ - public Builder(String property, Class entityClass, Class javaType, Class ofType, boolean auto) { + public Builder(String index, String property, Class entityClass, Class javaType, Class ofType, boolean auto) { this.mybatisLabel = new MybatisLabel<>(); mybatisLabel.property = property; + mybatisLabel.index = index; mybatisLabel.entityClass = entityClass; mybatisLabel.javaType = javaType; mybatisLabel.ofType = ofType; @@ -112,67 +114,91 @@ public class MybatisLabel { return this; } + public > Builder collection(Class entityClass, SFunction func) { + return collection(null, entityClass, func); + } + /** * 嵌套 */ - public > Builder collection(Class entityClass, SFunction func) { + public > Builder collection(Integer index, Class entityClass, SFunction func) { String dtoFieldName = LambdaUtils.getName(func); Class dtoClass = LambdaUtils.getEntityClass(func); Map fieldMap = MPJReflectionKit.getFieldMap(dtoClass); Field field = fieldMap.get(dtoFieldName); Class genericType = MPJReflectionKit.getGenericType(field); MybatisLabel.Builder builder; + String s = Objects.isNull(index) ? null : index.toString(); if (genericType == null || genericType.isAssignableFrom(entityClass)) { //找不到集合泛型 List List List , 直接查询数据库实体 - builder = new Builder<>(dtoFieldName, entityClass, field.getType()); + builder = new Builder<>(s, dtoFieldName, entityClass, field.getType()); } else { Class ofType = (Class) genericType; - builder = new Builder<>(dtoFieldName, entityClass, field.getType(), ofType, true); + builder = new Builder<>(s, dtoFieldName, entityClass, field.getType(), ofType, true); } mybatisLabel.mybatisLabels.add(builder.build()); return this; } + public > Builder collection(Class entityClass, SFunction func, MFunc> mFunc) { + return collection(null, entityClass, func, mFunc); + } + /** * 嵌套 */ - public > Builder collection(Class entityClass, SFunction func, MFunc> mFunc) { + public > Builder collection(Integer index, + Class entityClass, + SFunction func, + MFunc> mFunc) { String dtoFieldName = LambdaUtils.getName(func); Class dtoClass = LambdaUtils.getEntityClass(func); Field field = MPJReflectionKit.getFieldMap(dtoClass).get(dtoFieldName); //获取集合泛型 Class genericType = MPJReflectionKit.getGenericType(field); Class ofType = (Class) genericType; - MybatisLabel.Builder builder = new MybatisLabel.Builder<>(dtoFieldName, entityClass, field.getType(), ofType, false); + MybatisLabel.Builder builder = new MybatisLabel.Builder<>(Objects.isNull(index) ? null : index.toString(), + dtoFieldName, entityClass, field.getType(), ofType, false); mybatisLabel.mybatisLabels.add(mFunc.apply(builder).build()); return this; } + public Builder association(Class child, SFunction dtoField) { + return association(null, child, dtoField); + } + /** * 嵌套 */ - public Builder association(Class child, SFunction dtoField) { + public Builder association(Integer index, Class child, SFunction dtoField) { Class dtoClass = LambdaUtils.getEntityClass(dtoField); Map fieldMap = MPJReflectionKit.getFieldMap(dtoClass); String dtoFieldName = LambdaUtils.getName(dtoField); Field field = fieldMap.get(dtoFieldName); Assert.isFalse(Collection.class.isAssignableFrom(field.getType()), "association 不支持集合类"); MybatisLabel.Builder builder; - builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType(), (Class) field.getType(), true); + builder = new MybatisLabel.Builder<>(Objects.isNull(index) ? null : index.toString(), + dtoFieldName, child, field.getType(), (Class) field.getType(), true); mybatisLabel.mybatisLabels.add(builder.build()); return this; } + public Builder selectAssociation(Class child, SFunction dtoField, + MFunc> collection) { + return selectAssociation(null, child, dtoField, collection); + } + /** * 嵌套 */ - public Builder selectAssociation(Class child, SFunction dtoField, + public Builder selectAssociation(Integer index, Class child, SFunction dtoField, MFunc> collection) { String dtoFieldName = LambdaUtils.getName(dtoField); Class dtoClass = LambdaUtils.getEntityClass(dtoField); Field field = MPJReflectionKit.getFieldMap(dtoClass).get(dtoFieldName); Assert.isFalse(Collection.class.isAssignableFrom(field.getType()), "association 不支持集合类"); - MybatisLabel.Builder builder = new MybatisLabel.Builder<>(dtoFieldName, child, field.getType(), (Class) child, false); + MybatisLabel.Builder builder = new MybatisLabel.Builder<>(Objects.isNull(index) ? null : index.toString(), + dtoFieldName, child, field.getType(), (Class) child, false); mybatisLabel.mybatisLabels.add(collection.apply(builder).build()); return this; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java index 12a6dee..6eb2d44 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java @@ -14,7 +14,7 @@ import org.apache.ibatis.type.UnknownTypeHandler; import java.util.Objects; /** - * 缓存列, 普通列 + * 缓存 * * @author yulichang * @since 1.3.10 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 d3e6fd8..4f7f879 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 @@ -45,6 +45,9 @@ public class UserDO { @TableLogic private Boolean del; + @TableField(exist = false) + private String alias; + @TableField(exist = false) private List children; } diff --git a/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql b/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql index 51942b2..65cf279 100644 --- a/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql +++ b/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql @@ -29,28 +29,29 @@ INSERT INTO area (id, province, city, area, postcode, del) VALUES (10022, '北 DELETE FROM `user`; -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 1, 1, '张三 1', '{"id": 1,"name":"张三 1"}', 1, 1, 'https://url-01', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 2, 1, '张三 2', '{"id": 2,"name":"张三 2"}', 1, 0, 'https://url-02', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 3, 1, '张三 3', '{"id": 3,"name":"张三 3"}', 1, 0, 'https://url-03', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 4, 1, '张三 4', '{"id": 4,"name":"张三 4"}', 1, 0, 'https://url-04', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 5, 1, '张三 5', '{"id": 5,"name":"张三 5"}', 1, 0, 'https://url-05', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 6, 1, '张三 6', '{"id": 6,"name":"张三 6"}', 1, 0, 'https://url-06', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 7, 1, '张三 7', '{"id": 7,"name":"张三 7"}', 1, 0, 'https://url-07', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 8, 1, '张三 8', '{"id": 8,"name":"张三 8"}', 1, 0, 'https://url-08', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES ( 9, 1, '张三 9', '{"id": 9,"name":"张三 9"}', 1, 0, 'https://url-09', '2022-01-01 12:00:00', false); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (10, 1, '张三10', '{"id":10,"name":"张三10"}', 1, 0, 'https://url-10', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (11, 1, '张三11', '{"id":11,"name":"张三11"}', 1, 0, 'https://url-11', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (12, 1, '张三12', '{"id":12,"name":"张三12"}', 1, 0, 'https://url-12', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (13, 1, '张三13', '{"id":13,"name":"张三13"}', 1, 0, 'https://url-13', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (14, 1, '张三14', '{"id":14,"name":"张三14"}', 1, 0, 'https://url-14', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (15, 1, '张三15', '{"id":15,"name":"张三15"}', 1, 0, 'https://url-15', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (16, 1, '张三16', '{"id":16,"name":"张三16"}', 1, 0, 'https://url-16', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (17, 1, '张三17', '{"id":17,"name":"张三17"}', 1, 0, 'https://url-17', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (18, 1, '张三18', '{"id":18,"name":"张三18"}', 1, 0, 'https://url-18', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (19, 1, '张三19', '{"id":19,"name":"张三19"}', 1, 0, 'https://url-19', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (20, 1, '张三20', '{"id":20,"name":"张三20"}', 1, 0, 'https://url-20', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (21, 1, '张三21', '{"id":21,"name":"张三21"}', 1, 0, 'https://url-21', '2022-01-01 12:00:00', true ); -INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES (22, 1, '张三22', '{"id":22,"name":"张三22"}', 1, 0, 'https://url-22', '2022-01-01 12:00:00', true ); +INSERT INTO `user` (id, pid, `name`, `json`, `address_id`, sex, head_img, create_time, del) VALUES +( 1, 1, '张三 1', '{"id": 1,"name":"张三 1"}', 1, 1, 'https://url-01', '2022-01-01 12:00:00', false), +( 2, 1, '张三 2', '{"id": 2,"name":"张三 2"}', 1, 0, 'https://url-02', '2022-01-01 12:00:00', false), +( 3, 1, '张三 3', '{"id": 3,"name":"张三 3"}', 1, 0, 'https://url-03', '2022-01-01 12:00:00', false), +( 4, 1, '张三 4', '{"id": 4,"name":"张三 4"}', 1, 0, 'https://url-04', '2022-01-01 12:00:00', false), +( 5, 1, '张三 5', '{"id": 5,"name":"张三 5"}', 1, 0, 'https://url-05', '2022-01-01 12:00:00', false), +( 6, 1, '张三 6', '{"id": 6,"name":"张三 6"}', 1, 0, 'https://url-06', '2022-01-01 12:00:00', false), +( 7, 1, '张三 7', '{"id": 7,"name":"张三 7"}', 1, 0, 'https://url-07', '2022-01-01 12:00:00', false), +( 8, 1, '张三 8', '{"id": 8,"name":"张三 8"}', 1, 0, 'https://url-08', '2022-01-01 12:00:00', false), +( 9, 1, '张三 9', '{"id": 9,"name":"张三 9"}', 1, 0, 'https://url-09', '2022-01-01 12:00:00', false), +(10, 1, '张三10', '{"id":10,"name":"张三10"}', 1, 0, 'https://url-10', '2022-01-01 12:00:00', true ), +(11, 1, '张三11', '{"id":11,"name":"张三11"}', 1, 0, 'https://url-11', '2022-01-01 12:00:00', true ), +(12, 1, '张三12', '{"id":12,"name":"张三12"}', 1, 0, 'https://url-12', '2022-01-01 12:00:00', true ), +(13, 1, '张三13', '{"id":13,"name":"张三13"}', 1, 0, 'https://url-13', '2022-01-01 12:00:00', true ), +(14, 2, '张三14', '{"id":14,"name":"张三14"}', 1, 0, 'https://url-14', '2022-01-01 12:00:00', false), +(15, 2, '张三15', '{"id":15,"name":"张三15"}', 1, 0, 'https://url-15', '2022-01-01 12:00:00', false), +(16, 2, '张三16', '{"id":16,"name":"张三16"}', 1, 0, 'https://url-16', '2022-01-01 12:00:00', false), +(17, 2, '张三17', '{"id":17,"name":"张三17"}', 1, 0, 'https://url-17', '2022-01-01 12:00:00', false), +(18, 2, '张三18', '{"id":18,"name":"张三18"}', 1, 0, 'https://url-18', '2022-01-01 12:00:00', false), +(19, 2, '张三19', '{"id":19,"name":"张三19"}', 1, 0, 'https://url-19', '2022-01-01 12:00:00', true ), +(20, 2, '张三20', '{"id":20,"name":"张三20"}', 1, 0, 'https://url-20', '2022-01-01 12:00:00', true ), +(21, 2, '张三21', '{"id":21,"name":"张三21"}', 1, 0, 'https://url-21', '2022-01-01 12:00:00', true ), +(22, 2, '张三22', '{"id":22,"name":"张三22"}', 1, 0, 'https://url-22', '2022-01-01 12:00:00', true ); DELETE FROM address; diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 396803b..a2d6738 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -114,21 +114,27 @@ class LambdaWrapperTest { void testInner() { MPJLambdaWrapper wrapper = new MPJLambdaWrapper() // .disableSubLogicDel()//关闭副表逻辑删除 -// .disableLogicDel()//关闭主表逻辑删除 + .disableLogicDel()//关闭主表逻辑删除 .selectAll(UserDO.class) .selectCollection(UserDO.class, UserDO::getChildren) .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId); List list = userMapper.selectJoinList(UserDO.class, wrapper); + System.out.println(list); MPJLambdaWrapper wrapper1 = new MPJLambdaWrapper() .disableSubLogicDel() - .disableLogicDel() .selectAll(UserDO.class) - .selectCollection(UserDO.class, UserDO::getChildren) - .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId); + .selectCollection(1, UserDO.class, UserDO::getChildren, c -> c + .collection(2, UserDO.class, UserDO::getChildren)) + .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId, ext -> ext + .selectAs(UserDO::getName, UserDO::getAlias) + .leftJoin(UserDO.class, UserDO::getPid, UserDO::getId) + .le(UserDO::getId, 5)) + .le(UserDO::getId, 4); List list1 = userMapper.selectJoinList(UserDO.class, wrapper1); - - System.out.println(list); + System.out.println(wrapper1.getSqlSegment()); + assert "(t1.id <= #{ew.paramNameValuePairs.MPGENVAL1} AND t.id <= #{ew.paramNameValuePairs.MPGENVAL2})".equals(wrapper1.getSqlSegment()); + System.out.println(list1); } /** @@ -137,13 +143,13 @@ class LambdaWrapperTest { @Test void testLogicDel() { List l1 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper<>()); - assert l1.size() < 10; + assert l1.size() < 15; List l2 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper() .selectAll(UserDO.class) .select(AddressDO::getAddress) .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); - assert l2.size() <= 5; + assert l2.size() < 11; List l3 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper() .disableSubLogicDel() @@ -207,8 +213,8 @@ class LambdaWrapperTest { .selectAll(UserDO.class) .select(AddressDO::getAddress) .leftJoin(AddressDO.class, on -> on - .eq(UserDO::getId, AddressDO::getUserId) - .eq(UserDO::getId, AddressDO::getUserId)) + .eq(AddressDO::getUserId, UserDO::getId) + .eq(AddressDO::getUserId, UserDO::getId)) .eq(UserDO::getId, 1) .and(i -> i.eq(UserDO::getImg, "er") .or()