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); + } + +}