Browse Source

Merge pull request #5596 from baomidou/fix_5572

解决Unchecked generics array creation for varargs parameter警告.
qmdx 1 year ago
parent
commit
ef362ba78d

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

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.core.conditions;
 
 import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
@@ -23,7 +24,6 @@ import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import org.apache.ibatis.reflection.property.PropertyNamer;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -51,7 +51,7 @@ public abstract class AbstractLambdaWrapper<T, Children extends AbstractLambdaWr
 
     @SafeVarargs
     protected final String columnsToString(boolean onlyColumn, SFunction<T, ?>... columns) {
-        return columnsToString(onlyColumn, Arrays.asList(columns));
+        return columnsToString(onlyColumn, CollectionUtils.toList(columns));
     }
 
     protected final String columnsToString(boolean onlyColumn, List<SFunction<T, ?>> columns) {
@@ -68,6 +68,55 @@ public abstract class AbstractLambdaWrapper<T, Children extends AbstractLambdaWr
         return onlyColumn ? cache.getColumn() : cache.getColumnSelect();
     }
 
+    @Override
+    @SafeVarargs
+    public final Children groupBy(boolean condition, SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return super.groupBy(condition, column, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderBy(boolean condition, boolean isAsc, SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return orderBy(condition, isAsc, column, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children groupBy(SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return doGroupBy(true, column, CollectionUtils.toList(columns));
+    }
+
+
+    @Override
+    public Children groupBy(boolean condition, SFunction<T, ?> column, List<SFunction<T, ?>> columns) {
+        return doGroupBy(condition,column,columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByAsc(SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return super.orderByAsc(column, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByAsc(boolean condition, SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return super.orderByAsc(condition, column, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByDesc(SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return super.orderByDesc(column, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByDesc(boolean condition, SFunction<T, ?> column, SFunction<T, ?>... columns) {
+        return super.orderByDesc(condition, column, columns);
+    }
+
+
     /**
      * 获取 SerializedLambda 对应的列信息,从 lambda 表达式中推测实体类
      * <p>

+ 31 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -347,9 +347,21 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children groupBy(boolean condition, R column, R... columns) {
+        return doGroupBy(condition, column, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    public Children groupBy(boolean condition, R column, List<R> columns) {
+        return doGroupBy(condition, column, columns);
+    }
+
+    public Children doGroupBy(boolean condition, R column, List<R> columns) {
         return maybeDo(condition, () -> {
-            String one = columnToString(column);
-            if (ArrayUtils.isNotEmpty(columns)) {
+            String one = StringPool.EMPTY;
+            if (column != null) {
+                one = columnToString(column);
+            }
+            if (CollectionUtils.isNotEmpty(columns)) {
                 one += (StringPool.COMMA + columnsToString(columns));
             }
             final String finalOne = one;
@@ -357,18 +369,30 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
         });
     }
 
-    @Override
-    public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
+
+    public Children doOrderBy(boolean condition, boolean isAsc, R column, List<R> columns){
         return maybeDo(condition, () -> {
             final SqlKeyword mode = isAsc ? ASC : DESC;
-            appendSqlSegments(ORDER_BY, columnToSqlSegment(column), mode);
-            if (ArrayUtils.isNotEmpty(columns)) {
-                Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY,
+            if (column != null) {
+                appendSqlSegments(ORDER_BY, columnToSqlSegment(column), mode);
+            }
+            if (CollectionUtils.isNotEmpty(columns)) {
+                columns.forEach(c -> appendSqlSegments(ORDER_BY,
                     columnToSqlSegment(c), mode));
             }
         });
     }
 
+    @Override
+    public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
+        return doOrderBy(condition, isAsc, column, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    public Children orderBy(boolean condition, boolean isAsc, R column, List<R> columns) {
+        return doOrderBy(condition, isAsc, column, columns);
+    }
+
     @Override
     public Children groupBy(boolean condition, R column) {
         return maybeDo(condition, () -> appendSqlSegments(GROUP_BY, () -> columnToString(column)));

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

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.core.conditions.interfaces;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
@@ -294,6 +296,13 @@ public interface Func<Children, R> extends Serializable {
      */
     Children groupBy(boolean condition, R column, R... columns);
 
+    /**
+     * 分组:GROUP BY 字段, ...
+     * @since 3.5.4
+     */
+    Children groupBy(boolean condition, R column, List<R> columns);
+
+
     /**
      * 排序:ORDER BY 字段, ... ASC
      * <p>例: orderByAsc(true, "id")</p>
@@ -337,6 +346,15 @@ public interface Func<Children, R> extends Serializable {
         return orderBy(condition, true, column, columns);
     }
 
+    /**
+     * 排序:ORDER BY 字段, ... ASC
+     *
+     * @since 3.5.4
+     */
+    default Children orderByAsc(boolean condition, R column, List<R> columns) {
+        return orderBy(condition, true, column, columns);
+    }
+
     /**
      * 排序:ORDER BY 字段, ... DESC
      * <p>例: orderByDesc(true, "id")</p>
@@ -377,9 +395,19 @@ public interface Func<Children, R> extends Serializable {
      * 排序:ORDER BY 字段, ... DESC
      */
     default Children orderByDesc(boolean condition, R column, R... columns) {
+        return orderBy(condition, false, column, CollectionUtils.toList(columns));
+    }
+
+    /**
+     * 排序:ORDER BY 字段, ... DESC
+     *
+     * @since 3.5.4
+     */
+    default Children orderByDesc(boolean condition, R column, List<R> columns) {
         return orderBy(condition, false, column, columns);
     }
 
+
     /**
      * 排序:ORDER BY 字段, ...
      * <p>例: orderBy(true, "id")</p>
@@ -407,6 +435,15 @@ public interface Func<Children, R> extends Serializable {
      */
     Children orderBy(boolean condition, boolean isAsc, R column, R... columns);
 
+
+    /**
+     * 排序:ORDER BY 字段, ...
+     *
+     * @since 3.5.4
+     */
+    Children orderBy(boolean condition, boolean isAsc, R column, List<R> columns);
+
+
     /**
      * ignore
      */

+ 23 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper.java

@@ -75,10 +75,7 @@ public class LambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, LambdaQueryW
 
     @Override
     public LambdaQueryWrapper<T> select(boolean condition, List<SFunction<T, ?>> columns) {
-        if (condition && CollectionUtils.isNotEmpty(columns)) {
-            this.sqlSelect.setStringValue(columnsToString(false, columns));
-        }
-        return typedThis;
+        return doSelect(condition, columns);
     }
 
     /**
@@ -104,6 +101,28 @@ public class LambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, LambdaQueryW
         return typedThis;
     }
 
+    @Override
+    @SafeVarargs
+    public final LambdaQueryWrapper<T> select(SFunction<T, ?>... columns) {
+        return doSelect(true, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    @SafeVarargs
+    public final LambdaQueryWrapper<T> select(boolean condition, SFunction<T, ?>... columns) {
+        return doSelect(condition, CollectionUtils.toList(columns));
+    }
+
+    /**
+     * @since 3.5.4
+     */
+    protected LambdaQueryWrapper<T> doSelect(boolean condition, List<SFunction<T, ?>> columns) {
+        if (condition && CollectionUtils.isNotEmpty(columns)) {
+            this.sqlSelect.setStringValue(columnsToString(false, columns));
+        }
+        return typedThis;
+    }
+
     @Override
     public String getSqlSelect() {
         return sqlSelect.getStringValue();

+ 15 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/CollectionUtils.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.core.toolkit;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -217,4 +218,18 @@ public class CollectionUtils {
         Collections.sort(result, comparator);
         return result;
     }
+
+    /**
+     * 构建List
+     *
+     * @since 3.5.4
+     */
+    @SafeVarargs
+    public static <T> List<T> toList(T... t) {
+        if (t != null) {
+            return Arrays.asList(t);
+        }
+        return Collections.emptyList();
+    }
+
 }

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

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.interfaces.Func;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Join;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Nested;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 
 import java.util.Collection;
@@ -237,39 +238,95 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
     }
 
     @Override
-    public Children groupBy(boolean condition, R column, R... columns) {
-        getWrapper().groupBy(condition, column, columns);
-        return typedThis;
+    @SafeVarargs
+    public final Children groupBy(boolean condition, R column, R... columns) {
+        return doGroupBy(condition, column, CollectionUtils.toList(columns));
+    }
+
+    public Children groupBy(boolean condition, R column, List<R> columns) {
+        return doGroupBy(condition, column, columns);
     }
 
     @Override
     public Children groupBy(boolean condition, R column) {
-        getWrapper().groupBy(condition, column);
-        return typedThis;
+        return doGroupBy(condition, column, null);
     }
 
     @Override
     public Children groupBy(boolean condition, List<R> columns) {
-        getWrapper().groupBy(condition, columns);
-        return typedThis;
+        return doGroupBy(condition, null, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
+        return orderBy(condition, isAsc, column, CollectionUtils.toList(columns));
+    }
+
+    public Children orderBy(boolean condition, boolean isAsc, R column, List<R> columns) {
+        return doOrderBy(condition, isAsc, column, columns);
     }
 
     @Override
-    public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
-        getWrapper().orderBy(condition, isAsc, column, columns);
+    @SafeVarargs
+    public final Children groupBy(R column, R... columns) {
+        return doGroupBy(true, column, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByAsc(R column, R... columns) {
+        return orderByAsc(true, column, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByAsc(boolean condition, R column, R... columns) {
+        return doOrderByAsc(condition, column, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByDesc(boolean condition, R column, R... columns) {
+        return doOrderByDesc(condition, column, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    @SafeVarargs
+    public final Children orderByDesc(R column, R... columns) {
+        return orderByDesc(true, column, columns);
+    }
+
+    // --------------  新增重写方法开始----------------
+    protected Children doOrderByDesc(boolean condition, R column, List<R> columns) {
+        return doOrderBy(condition, false, column, columns);
+    }
+
+    protected Children doOrderByAsc(boolean condition, R column, List<R> columns) {
+        return doOrderBy(condition, true, column, columns);
+    }
+
+    protected Children doOrderBy(boolean condition, boolean isAsc, R column, List<R> columns) {
+        getWrapper().doOrderBy(condition, isAsc, column, columns);
+        return typedThis;
+    }
+
+    protected Children doGroupBy(boolean condition, R column, List<R> columns) {
+        getWrapper().doGroupBy(condition, column, columns);
         return typedThis;
     }
 
+
+    // --------------  新增重写方法结束----------------
+
     @Override
     public Children orderBy(boolean condition, boolean isAsc, R column) {
-        getWrapper().orderBy(condition, isAsc, column);
-        return typedThis;
+        return doOrderBy(condition, isAsc, column, null);
     }
 
     @Override
     public Children orderBy(boolean condition, boolean isAsc, List<R> columns) {
-        getWrapper().orderBy(condition, isAsc, columns);
-        return typedThis;
+        return doOrderBy(condition, isAsc, null, columns);
     }
 
     @Override

+ 20 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/query/LambdaQueryChainWrapper.java

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.Query;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.conditions.AbstractChainWrapper;
@@ -62,6 +63,25 @@ public class LambdaQueryChainWrapper<T> extends AbstractChainWrapper<T, SFunctio
 
     @Override
     public LambdaQueryChainWrapper<T> select(boolean condition, List<SFunction<T, ?>> columns) {
+        return doSelect(condition, columns);
+    }
+
+    @Override
+    @SafeVarargs
+    public final LambdaQueryChainWrapper<T> select(SFunction<T, ?>... columns) {
+        return doSelect(true, CollectionUtils.toList(columns));
+    }
+
+    @Override
+    @SafeVarargs
+    public final LambdaQueryChainWrapper<T> select(boolean condition, SFunction<T, ?>... columns) {
+        return doSelect(condition, CollectionUtils.toList(columns));
+    }
+
+    /**
+     * @since 3.5.4
+     */
+    protected LambdaQueryChainWrapper<T> doSelect(boolean condition, List<SFunction<T, ?>> columns) {
         wrapperChildren.select(condition, columns);
         return typedThis;
     }

+ 53 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
@@ -826,4 +827,56 @@ class H2UserTest extends BaseTest {
         );
     }
 
+    @Test
+    void testUnchecked() {
+        Wrappers.<H2User>lambdaQuery()
+            .select(H2User::getAge, H2User::getAge).select(true, H2User::getDeleted, H2User::getDeleted)
+            .orderBy(true, true, H2User::getAge, H2User::getAge)
+            .orderByAsc(H2User::getAge, H2User::getDeleted).orderByAsc(true, H2User::getAge, H2User::getTestType)
+            .orderByDesc(H2User::getDeleted, H2User::getPrice).orderByDesc(true, H2User::getDeleted, H2User::getTestType)
+            .groupBy(H2User::getAge, H2User::getTestType).groupBy(true, H2User::getAge, H2User::getTestType);
+
+        new LambdaQueryChainWrapper<>(H2User.class)
+            .select(H2User::getAge).select(true, H2User::getDeleted, H2User::getDeleted)
+            .orderBy(true, true, H2User::getAge, H2User::getAge)
+            .orderByAsc(H2User::getAge, H2User::getDeleted).orderByAsc(true, H2User::getAge, H2User::getTestType)
+            .orderByDesc(H2User::getDeleted, H2User::getPrice).orderByDesc(true, H2User::getDeleted, H2User::getTestType)
+            .groupBy(H2User::getAge, H2User::getTestType).groupBy(true, H2User::getAge, H2User::getTestType);
+
+        // 重写方法保留支持.
+        new LambdaQueryChainWrapper<H2User>(H2User.class) {
+            @Override
+            protected LambdaQueryChainWrapper<H2User> doOrderByDesc(boolean condition, SFunction<H2User, ?> column, List<SFunction<H2User, ?>> columns) {
+                System.out.println("-------处理OrderByDesc----------");
+                return super.doOrderByDesc(condition, column, columns);
+            }
+            @Override
+            protected LambdaQueryChainWrapper<H2User> doOrderByAsc(boolean condition, SFunction<H2User, ?> column,  List<SFunction<H2User, ?>> columns) {
+                System.out.println("-------处理OrderByAsc----------");
+                return super.doOrderByAsc(condition, column, columns);
+            }
+            @Override
+            protected LambdaQueryChainWrapper<H2User> doOrderBy(boolean condition, boolean isAsc, SFunction<H2User, ?> column, List<SFunction<H2User, ?>> columns) {
+                System.out.println("-------处理OrderBy----------");
+                return super.doOrderBy(condition, isAsc, column, columns);
+            }
+            @Override
+            protected LambdaQueryChainWrapper<H2User> doGroupBy(boolean condition, SFunction<H2User, ?> column, List<SFunction<H2User, ?>> columns) {
+                System.out.println("-------处理GroupBy----------");
+                return super.doGroupBy(condition, column, columns);
+            }
+
+            @Override
+            protected LambdaQueryChainWrapper<H2User> doSelect(boolean condition, List<SFunction<H2User, ?>> columns) {
+                System.out.println("-------处理Select----------");
+                return super.doSelect(condition, columns);
+            }
+        }
+            .select(H2User::getAge)
+            .select(true, H2User::getDeleted, H2User::getDeleted)
+            .orderBy(true, true, H2User::getAge, H2User::getAge)
+            .orderByAsc(H2User::getAge, H2User::getDeleted).orderByAsc(true, H2User::getAge, H2User::getTestType)
+            .orderByDesc(H2User::getDeleted, H2User::getPrice).orderByDesc(true, H2User::getDeleted, H2User::getTestType)
+            .groupBy(H2User::getAge, H2User::getTestType).groupBy(true, H2User::getAge, H2User::getTestType);
+    }
 }