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