Explorar o código

wrapper orderBy 和 groupBy 入参数调整

miemie %!s(int64=4) %!d(string=hai) anos
pai
achega
3b27da2426

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractLambdaWrapper.java

@@ -89,9 +89,9 @@ public abstract class AbstractLambdaWrapper<T, Children extends AbstractLambdaWr
                 lambdaClass = entityClass;
             }
             columnMap = LambdaUtils.getColumnMap(lambdaClass);
+            Assert.notNull(columnMap, "can not find lambda cache for this entity [%s]", lambdaClass.getName());
             initColumnMap = true;
         }
-        Assert.notNull(columnMap, "can not find lambda cache for this entity [%s]", lambdaClass.getName());
     }
 
     private ColumnCache getColumnCache(String fieldName, Class<?> lambdaClass) {

+ 19 - 13
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -292,22 +292,28 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
     }
 
     @Override
-    public Children groupBy(boolean condition, R... columns) {
-        if (ArrayUtils.isEmpty(columns)) {
-            return typedThis;
+    public Children groupBy(boolean condition, R column, R... columns) {
+        if (condition) {
+            String one = columnToString(column);
+            if (ArrayUtils.isNotEmpty(columns)) {
+                one += (StringPool.COMMA + columnsToString(columns));
+            }
+            final String finalOne = one;
+            doIt(true, GROUP_BY, () -> finalOne);
         }
-        return doIt(condition, GROUP_BY,
-            () -> columns.length == 1 ? columnToString(columns[0]) : columnsToString(columns));
+        return typedThis;
     }
 
     @Override
-    public Children orderBy(boolean condition, boolean isAsc, R... columns) {
-        if (ArrayUtils.isEmpty(columns)) {
-            return typedThis;
-        }
-        SqlKeyword mode = isAsc ? ASC : DESC;
-        for (R column : columns) {
-            doIt(condition, ORDER_BY, () -> columnToString(column), mode);
+    public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
+        if (condition) {
+            SqlKeyword mode = isAsc ? ASC : DESC;
+            doIt(true, ORDER_BY, () -> columnToString(column), mode);
+            if (ArrayUtils.isNotEmpty(columns)) {
+                for (R c : columns) {
+                    doIt(true, ORDER_BY, () -> columnToString(c), mode);
+                }
+            }
         }
         return typedThis;
     }
@@ -429,7 +435,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      *
      * @param value 集合
      */
-    private ISqlSegment inExpression(Collection<?> value) {
+    protected ISqlSegment inExpression(Collection<?> value) {
         return () -> value.stream().map(i -> formatSql("{0}", i))
             .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
     }

+ 16 - 33
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Func.java

@@ -191,15 +191,8 @@ public interface Func<Children, R> extends Serializable {
     /**
      * ignore
      */
-    default Children groupBy(R column) {
-        return groupBy(true, column);
-    }
-
-    /**
-     * ignore
-     */
-    default Children groupBy(R... columns) {
-        return groupBy(true, columns);
+    default Children groupBy(R column, R... columns) {
+        return groupBy(true, column, columns);
     }
 
     /**
@@ -207,23 +200,17 @@ public interface Func<Children, R> extends Serializable {
      * <p>例: groupBy("id", "name")</p>
      *
      * @param condition 执行条件
+     * @param column    单个字段
      * @param columns   字段数组
      * @return children
      */
-    Children groupBy(boolean condition, R... columns);
+    Children groupBy(boolean condition, R column, R... columns);
 
     /**
      * ignore
      */
-    default Children orderByAsc(R column) {
-        return orderByAsc(true, column);
-    }
-
-    /**
-     * ignore
-     */
-    default Children orderByAsc(R... columns) {
-        return orderByAsc(true, columns);
+    default Children orderByAsc(R column, R... columns) {
+        return orderByAsc(true, column, columns);
     }
 
     /**
@@ -231,25 +218,19 @@ public interface Func<Children, R> extends Serializable {
      * <p>例: orderByAsc("id", "name")</p>
      *
      * @param condition 执行条件
+     * @param column    单个字段
      * @param columns   字段数组
      * @return children
      */
-    default Children orderByAsc(boolean condition, R... columns) {
-        return orderBy(condition, true, columns);
-    }
-
-    /**
-     * ignore
-     */
-    default Children orderByDesc(R column) {
-        return orderByDesc(true, column);
+    default Children orderByAsc(boolean condition, R column, R... columns) {
+        return orderBy(condition, true, column, columns);
     }
 
     /**
      * ignore
      */
-    default Children orderByDesc(R... columns) {
-        return orderByDesc(true, columns);
+    default Children orderByDesc(R column, R... columns) {
+        return orderByDesc(true, column, columns);
     }
 
     /**
@@ -257,11 +238,12 @@ public interface Func<Children, R> extends Serializable {
      * <p>例: orderByDesc("id", "name")</p>
      *
      * @param condition 执行条件
+     * @param column    单个字段
      * @param columns   字段数组
      * @return children
      */
-    default Children orderByDesc(boolean condition, R... columns) {
-        return orderBy(condition, false, columns);
+    default Children orderByDesc(boolean condition, R column, R... columns) {
+        return orderBy(condition, false, column, columns);
     }
 
     /**
@@ -270,10 +252,11 @@ public interface Func<Children, R> extends Serializable {
      *
      * @param condition 执行条件
      * @param isAsc     是否是 ASC 排序
+     * @param column    单个字段
      * @param columns   字段数组
      * @return children
      */
-    Children orderBy(boolean condition, boolean isAsc, R... columns);
+    Children orderBy(boolean condition, boolean isAsc, R column, R... columns);
 
     /**
      * ignore

+ 5 - 9
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/WrapperTest.java

@@ -26,11 +26,7 @@ import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 class WrapperTest {
 
@@ -39,7 +35,7 @@ class WrapperTest {
     }
 
     private void logSqlSegment(String explain, Wrapper<?> wrapper, String targetSql) {
-        System.out.println(String.format(" ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   ->(%s)<-   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓", explain));
+        System.out.printf(" ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   ->(%s)<-   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓%n", explain);
         System.out.println(wrapper.getSqlSegment());
         System.out.println(wrapper.getTargetSql());
         Assertions.assertThat(wrapper.getTargetSql().trim()).isEqualTo(targetSql);
@@ -174,13 +170,13 @@ class WrapperTest {
     void testFunc() {
         QueryWrapper<User> queryWrapper = new QueryWrapper<User>()
             .isNull("nullColumn").or().isNotNull("notNullColumn")
-            .orderByAsc("id").orderByDesc("name")
-            .groupBy("id", "name").groupBy("id2", "name2")
+            .orderByAsc("id").orderByDesc("name","name2")
+            .groupBy("id").groupBy("name", "id2", "name2")
             .in("inColl", getList()).or().notIn("notInColl", getList())
             .in("inArray").notIn("notInArray", 1, 2, 3)
             .inSql("inSql", "1,2,3,4,5").notInSql("inSql", "1,2,3,4,5")
             .having("sum(age) > {0}", 1).having("id is not null");
-        logSqlSegment("测试 Func 下的方法", queryWrapper, "(nullColumn IS NULL OR notNullColumn IS NOT NULL AND inColl IN (?,?) OR notInColl NOT IN (?,?) AND inArray IN () AND notInArray NOT IN (?,?,?) AND inSql IN (1,2,3,4,5) AND inSql NOT IN (1,2,3,4,5)) GROUP BY id,name,id2,name2 HAVING sum(age) > ? AND id is not null ORDER BY id ASC,name DESC");
+        logSqlSegment("测试 Func 下的方法", queryWrapper, "(nullColumn IS NULL OR notNullColumn IS NOT NULL AND inColl IN (?,?) OR notInColl NOT IN (?,?) AND inArray IN () AND notInArray NOT IN (?,?,?) AND inSql IN (1,2,3,4,5) AND inSql NOT IN (1,2,3,4,5)) GROUP BY id,name,id2,name2 HAVING sum(age) > ? AND id is not null ORDER BY id ASC,name DESC,name2 DESC");
         logParams(queryWrapper);
     }
 

+ 4 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/AbstractChainWrapper.java

@@ -188,14 +188,14 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
     }
 
     @Override
-    public Children groupBy(boolean condition, R... columns) {
-        getWrapper().groupBy(condition, columns);
+    public Children groupBy(boolean condition, R column, R... columns) {
+        getWrapper().groupBy(condition, column, columns);
         return typedThis;
     }
 
     @Override
-    public Children orderBy(boolean condition, boolean isAsc, R... columns) {
-        getWrapper().orderBy(condition, isAsc, columns);
+    public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
+        getWrapper().orderBy(condition, isAsc, column, columns);
         return typedThis;
     }