From 25b3df16cff31568e15fb6572d900f3da6d7046c Mon Sep 17 00:00:00 2001
From: yulichang <570810310@qq.com>
Date: Sun, 10 Dec 2023 05:45:42 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96idea=E4=BB=A3=E7=A0=81?=
=?UTF-8?q?=E8=AD=A6=E5=91=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../yulichang/kt/KtAbstractLambdaWrapper.java | 10 +-
.../yulichang/kt/KtAbstractWrapper.java | 74 ++++++-------
.../yulichang/wrapper/MPJAbstractWrapper.java | 101 +++++++++++++++++-
.../yulichang/test/join/m/OrderByTest.java | 58 ++++++++++
4 files changed, 197 insertions(+), 46 deletions(-)
create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java
index b1a6ad8..874577d 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java
@@ -43,6 +43,7 @@ public abstract class KtAbstractLambdaWrapper columnToString(index, (KProperty>) i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA));
+ protected final String columnsToString(Integer index, PrefixEnum prefixEnum, KProperty>... columns) {
+ return Arrays.stream(columns).map(i -> columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA));
}
protected String columnToString(Integer index, KProperty> column, boolean isJoin, PrefixEnum prefixEnum) {
@@ -337,6 +338,7 @@ public abstract class KtAbstractLambdaWrapper LogicInfoUtils.getLogicInfoNoAnd(
wrapper.getIndex(), wrapper.getJoinClass(), wrapper.isHasAlias(), wrapper.getAlias()
@@ -364,10 +366,6 @@ public abstract class KtAbstractLambdaWrapper> extends Wrapper
implements Compare, Nested, Join, Func, OnCompare,
CompareStr, FuncStr {
@@ -61,6 +61,7 @@ public abstract class KtAbstractWrapper paramNameValuePairs;
/**
* 其他
@@ -239,13 +240,13 @@ public abstract class KtAbstractWrapper column, Object val1, Object val2) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), BETWEEN,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), BETWEEN,
() -> formatParam(null, val1), AND, () -> formatParam(null, val2)));
}
@Override
public Children notBetween(boolean condition, KProperty> column, Object val1, Object val2) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_BETWEEN,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_BETWEEN,
() -> formatParam(null, val1), AND, () -> formatParam(null, val2)));
}
@@ -317,68 +318,68 @@ public abstract class KtAbstractWrapper column) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NULL));
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IS_NULL));
}
@Override
public Children isNotNull(boolean condition, KProperty> column) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NOT_NULL));
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IS_NOT_NULL));
}
@Override
public Children in(boolean condition, KProperty> column, Collection> coll) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(coll)));
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, inExpression(coll)));
}
@Override
public Children in(boolean condition, KProperty> column, Object... values) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(values)));
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, inExpression(values)));
}
@Override
public Children notIn(boolean condition, KProperty> column, Collection> coll) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(coll)));
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, inExpression(coll)));
}
@Override
public Children notIn(boolean condition, KProperty> column, Object... values) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(values)));
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, inExpression(values)));
}
@Override
public Children inSql(boolean condition, KProperty> column, String inValue) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN,
() -> String.format("(%s)", inValue)));
}
@Override
public Children notInSql(boolean condition, KProperty> column, String inValue) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN,
() -> String.format("(%s)", inValue)));
}
@Override
public Children gtSql(boolean condition, KProperty> column, String inValue) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GT,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), GT,
() -> String.format("(%s)", inValue)));
}
@Override
public Children geSql(boolean condition, KProperty> column, String inValue) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GE,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), GE,
() -> String.format("(%s)", inValue)));
}
@Override
public Children ltSql(boolean condition, KProperty> column, String inValue) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LT,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), LT,
() -> String.format("(%s)", inValue)));
}
@Override
public Children leSql(boolean condition, KProperty> column, String inValue) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LE,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), LE,
() -> String.format("(%s)", inValue)));
}
@@ -386,8 +387,7 @@ public abstract class KtAbstractWrapper> columns) {
return maybeDo(condition, () -> {
if (CollectionUtils.isNotEmpty(columns)) {
- String one = (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns));
- final String finalOne = one;
+ final String finalOne = columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns);
appendSqlSegments(GROUP_BY, () -> finalOne);
}
});
@@ -398,7 +398,7 @@ public abstract class KtAbstractWrapper {
String one = columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
if (ArrayUtils.isNotEmpty(columns)) {
- one += (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns));
+ one += columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns);
}
final String finalOne = one;
appendSqlSegments(GROUP_BY, () -> finalOne);
@@ -408,10 +408,9 @@ public abstract class KtAbstractWrapper> columns) {
return maybeDo(condition, () -> {
- final SqlKeyword mode = ASC;
if (CollectionUtils.isNotEmpty(columns)) {
columns.forEach(c -> appendSqlSegments(ORDER_BY,
- columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode));
+ columnToSqlSegment(index, columnSqlInjectFilter(c)), ASC));
}
});
}
@@ -419,10 +418,9 @@ public abstract class KtAbstractWrapper> columns) {
return maybeDo(condition, () -> {
- final SqlKeyword mode = DESC;
if (CollectionUtils.isNotEmpty(columns)) {
columns.forEach(c -> appendSqlSegments(ORDER_BY,
- columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode));
+ columnToSqlSegment(index, columnSqlInjectFilter(c)), DESC));
}
});
}
@@ -431,10 +429,10 @@ public abstract class KtAbstractWrapper column, KProperty>... columns) {
return maybeDo(condition, () -> {
final SqlKeyword mode = isAsc ? ASC : DESC;
- appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column, false), mode);
+ appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column), mode);
if (ArrayUtils.isNotEmpty(columns)) {
Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY,
- columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode));
+ columnToSqlSegment(index, columnSqlInjectFilter(c)), mode));
}
});
}
@@ -443,7 +441,7 @@ public abstract class KtAbstractWrapper columnSqlInjectFilter(KProperty> column) {
return column;
@@ -481,7 +479,7 @@ public abstract class KtAbstractWrapper拼接 LIKE 以及 值
*/
protected Children likeValue(boolean condition, SqlKeyword keyword, KProperty> column, Object val, SqlLike sqlLike) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), keyword,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), keyword,
() -> formatParam(null, SqlUtils.concatLike(val, sqlLike))));
}
@@ -499,14 +497,14 @@ public abstract class KtAbstractWrapper column, SqlKeyword sqlKeyword, Object val) {
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), sqlKeyword,
() -> formatParam(null, val)));
}
protected Children addCondition(boolean condition, KProperty> column, SqlKeyword sqlKeyword, KProperty> val) {
Class c = (Class) KtUtils.ref(column);
Class v = (Class) KtUtils.ref(val);
- return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword,
+ return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), sqlKeyword,
isNo ?
columnToSqlSegmentS(index, val, v == c && v == joinClass) :
columnToSqlSegmentS(index, val, v == c)
@@ -550,6 +548,7 @@ public abstract class KtAbstractWrapper getParamNameValuePairs() {
- return paramNameValuePairs;
- }
-
public String getParamAlias() {
return paramAlias.getStringValue() == null ? Constants.WRAPPER : paramAlias.getStringValue();
}
@@ -685,6 +680,7 @@ public abstract class KtAbstractWrapper column, boolean isJoin) {
- return () -> columnToString(index, column, isJoin, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
+ protected final ISqlSegment columnToSqlSegment(Integer index, KProperty> column) {
+ return () -> columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
}
protected final ISqlSegment columnToSqlSegmentS(Integer index, KProperty> column, boolean isJoin) {
@@ -740,12 +736,16 @@ public abstract class KtAbstractWrapper this.columnToString(index, i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA));
+ protected String columnsToString(Integer index, PrefixEnum prefixEnum, KProperty>... columns) {
+ return Arrays.stream(columns).map(i -> this.columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA));
}
+ protected String columnsToString(Integer index, PrefixEnum prefixEnum, List> columns) {
+ return columns.stream().map(i -> this.columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA));
+ }
+
+ @SuppressWarnings("MethodDoesntCallSuperMethod")
@Override
- @SuppressWarnings("all")
public Children clone() {
return SerializationUtils.clone(typedThis);
}
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 dbd1832..d8ee2e4 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
@@ -400,14 +400,32 @@ public abstract class MPJAbstractWrapper Children groupBy(boolean condition, String alias, List> columns) {
return maybeDo(condition, () -> {
if (CollectionUtils.isNotEmpty(columns)) {
- final String finalOne = (StringPool.COMMA + columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns));
+ final String finalOne = columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns);
appendSqlSegments(GROUP_BY, () -> finalOne);
}
});
}
- @SafeVarargs
@Override
+ @SafeVarargs
+ public final Children groupBy(SFunction column, SFunction... columns) {
+ return groupBy(true, null, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children groupBy(String alias, SFunction column, SFunction... columns) {
+ return groupBy(true, alias, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children groupBy(boolean condition, SFunction column, SFunction... columns) {
+ return groupBy(condition, null, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
public final Children groupBy(boolean condition, String alias, SFunction column, SFunction... columns) {
return maybeDo(condition, () -> {
String one = columnToString(index, alias, column, false, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
@@ -429,6 +447,39 @@ public abstract class MPJAbstractWrapper Children orderByAsc(SFunction column, SFunction... columns) {
+ return orderByAsc(true, null, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children orderByAsc(String alias, SFunction column, SFunction... columns) {
+ return orderByAsc(true, alias, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children orderByAsc(boolean condition, String alias, SFunction column, SFunction... columns) {
+ return orderBy(condition, true, alias, column, columns);
+ }
+
+ /**
+ * 排序:ORDER BY 字段, ... ASC
+ * 例: orderByAsc("id", "name")
+ *
+ * @param condition 执行条件
+ * @param column 单个字段
+ * @param columns 字段数组
+ * @return children
+ */
+ @Override
+ @SafeVarargs
+ public final Children orderByAsc(boolean condition, SFunction column, SFunction... columns) {
+ return orderBy(condition, true, null, column, columns);
+ }
+
@Override
public Children orderByDesc(boolean condition, String alias, List> columns) {
return maybeDo(condition, () -> {
@@ -440,7 +491,41 @@ public abstract class MPJAbstractWrapper Children orderBy(boolean condition, boolean isAsc, String alias, SFunction column, SFunction... columns) {
+ @SafeVarargs
+ public final Children orderByDesc(SFunction column, SFunction... columns) {
+ return orderByDesc(true, null, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children orderByDesc(String alias, SFunction column, SFunction... columns) {
+ return orderByDesc(true, alias, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children orderByDesc(boolean condition, String alias, SFunction column, SFunction... columns) {
+ return orderBy(condition, false, alias, column, columns);
+ }
+
+ /**
+ * 排序:ORDER BY 字段, ... DESC
+ * 例: orderByDesc("id", "name")
+ *
+ * @param condition 执行条件
+ * @param column 单个字段
+ * @param columns 字段数组
+ * @return children
+ */
+ @Override
+ @SafeVarargs
+ public final Children orderByDesc(boolean condition, SFunction column, SFunction... columns) {
+ return orderBy(condition, false, null, column, columns);
+ }
+
+ @Override
+ @SafeVarargs
+ public final Children orderBy(boolean condition, boolean isAsc, String alias, SFunction column, SFunction... columns) {
return maybeDo(condition, () -> {
final SqlKeyword mode = isAsc ? ASC : DESC;
appendSqlSegments(ORDER_BY, columnToSqlSegment(index, alias, column), mode);
@@ -451,6 +536,12 @@ public abstract class MPJAbstractWrapper Children orderBy(boolean condition, boolean isAsc, SFunction column, SFunction... columns) {
+ return orderBy(condition, isAsc, null, column, columns);
+ }
+
/**
* 字段 SQL 注入过滤处理,子类重写实现过滤逻辑
*
@@ -751,6 +842,10 @@ public abstract class MPJAbstractWrapper String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, X... columns);
+ public String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, List columns) {
+ return columns.stream().map(i -> columnToString(index, alias, (SFunction, ?>) i, false, prefixEnum)).collect(joining(StringPool.COMMA));
+ }
+
@Override
@SuppressWarnings("MethodDoesntCallSuperMethod")
public Children clone() {
diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java
new file mode 100644
index 0000000..f016bd4
--- /dev/null
+++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java
@@ -0,0 +1,58 @@
+package com.github.yulichang.test.join.m;
+
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+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 org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.Arrays;
+import java.util.List;
+
+@SpringBootTest
+public class OrderByTest {
+
+ @BeforeEach
+ void setUp() {
+ Reset.reset();
+ }
+
+ @Test
+ void orderBy() {
+ 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 WHERE t.del = false AND (t.id = ?) ORDER BY t.id ASC, t.`name` ASC, t.pid ASC");
+ List> columList = Arrays.asList(UserDO::getId, UserDO::getName, UserDO::getPid);
+
+ MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class)
+ .selectAll(UserDO.class)
+ .eq(UserDO::getId, 1)
+ .orderByAsc(columList);
+
+
+ List list = wrapper.list();
+ list.forEach(System.out::println);
+ }
+
+ @Test
+ void orderBy1() {
+ 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 WHERE t.del = false AND (t.id = ?) GROUP BY t.id, t.`name`, t.pid");
+ List> columList = Arrays.asList(UserDO::getId, UserDO::getName, UserDO::getPid);
+
+ MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class)
+ .selectAll(UserDO.class)
+ .eq(UserDO::getId, 1)
+ .groupBy(columList);
+// .groupBy(UserDO::getId, UserDO::getName, UserDO::getPid);
+// .orderByAsc(columList);
+
+
+ List list = wrapper.list();
+ list.forEach(System.out::println);
+ }
+
+}