Browse Source

新增 inOrThrow 方法, coll 为 empty 则抛出异常

miemie 6 năm trước cách đây
mục cha
commit
6e53ca16f5

+ 17 - 44
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -15,30 +15,13 @@
  */
 package com.baomidou.mybatisplus.core.conditions;
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.AND;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ASC;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.BETWEEN;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.DESC;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EQ;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EXISTS;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GE;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GROUP_BY;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GT;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.HAVING;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IN;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NOT_NULL;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NULL;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LE;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LIKE;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LT;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NE;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.OR;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
-import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
-import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.LEFT_BRACKET;
-import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.RIGHT_BRACKET;
-import static java.util.stream.Collectors.joining;
+import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
+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.enums.SqlKeyword;
+import com.baomidou.mybatisplus.core.toolkit.*;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -48,19 +31,9 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiPredicate;
 import java.util.function.Function;
 
-import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
-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.enums.SqlKeyword;
-import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
+import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.*;
+import static java.util.stream.Collectors.joining;
 
 
 /**
@@ -86,12 +59,12 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     private static final String PLACE_HOLDER = "{%s}";
     private static final String MYBATIS_PLUS_TOKEN = "#{%s.paramNameValuePairs.%s}";
     protected final This typedThis = (This) this;
+    protected final String paramAlias = null;
     /**
      * 必要度量
      */
     protected AtomicInteger paramNameSeq;
     protected Map<String, Object> paramNameValuePairs;
-    protected final String paramAlias = null;
     protected String lastSql = StringPool.EMPTY;
     /**
      * 数据库表映射实体类
@@ -274,19 +247,19 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This in(boolean condition, R column, Collection<?> value) {
-        if (CollectionUtils.isEmpty(value)) {
+    public This in(boolean condition, R column, Collection<?> coll) {
+        if (CollectionUtils.isEmpty(coll)) {
             return typedThis;
         }
-        return doIt(condition, () -> columnToString(column), IN, inExpression(value));
+        return doIt(condition, () -> columnToString(column), IN, inExpression(coll));
     }
 
     @Override
-    public This notIn(boolean condition, R column, Collection<?> value) {
-        if (CollectionUtils.isEmpty(value)) {
+    public This notIn(boolean condition, R column, Collection<?> coll) {
+        if (CollectionUtils.isEmpty(coll)) {
             return typedThis;
         }
-        return not(condition).in(condition, column, value);
+        return not(condition).in(condition, column, coll);
     }
 
     @Override

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

@@ -15,13 +15,15 @@
  */
 package com.baomidou.mybatisplus.core.conditions.interfaces;
 
-import static java.util.stream.Collectors.toList;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
 
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Optional;
 
+import static java.util.stream.Collectors.toList;
+
 /**
  * <p>
  * 查询条件封装
@@ -69,19 +71,65 @@ public interface Func<This, R> extends Serializable {
     /**
      * ignore
      */
-    default This in(R column, Collection<?> value) {
-        return in(true, column, value);
+    default This in(R column, Collection<?> coll) {
+        return in(true, column, coll);
+    }
+
+    /**
+     * ignore
+     */
+    default This inOrThrow(R column, Collection<?> value) {
+        return inOrThrow(true, column, value);
+    }
+
+    /**
+     * 字段 IN (value.get(0), value.get(1), ...)
+     * 例: in("id", Arrays.asList(1,2,3,4,5))
+     *
+     * <li> 如果集合为 empty 则直接抛出异常 </li>
+     *
+     * @param condition 执行条件
+     * @param column    字段
+     * @param coll      数据集合
+     */
+    default This inOrThrow(boolean condition, R column, Collection<?> coll) {
+        Assert.notEmpty(coll, "coll could not be empty!");
+        return in(condition, column, coll);
     }
 
     /**
      * 字段 IN (value.get(0), value.get(1), ...)
      * 例: in("id", Arrays.asList(1,2,3,4,5))
      *
+     * <li> 如果集合为 empty 则不会进行 sql 拼接 </li>
+     *
      * @param condition 执行条件
      * @param column    字段
-     * @param value     数据集合
+     * @param coll      数据集合
      */
-    This in(boolean condition, R column, Collection<?> value);
+    This in(boolean condition, R column, Collection<?> coll);
+
+    /**
+     * ignore
+     */
+    default This inOrThrow(R column, Object... values) {
+        return inOrThrow(true, column, values);
+    }
+
+    /**
+     * 字段 IN (value.get(0), value.get(1), ...)
+     * 例: in("id", Arrays.asList(1,2,3,4,5))
+     *
+     * <li> 如果数组为 empty 则直接抛出异常 </li>
+     *
+     * @param condition 执行条件
+     * @param column    字段
+     * @param values    数据数组
+     */
+    default This inOrThrow(boolean condition, R column, Object... values) {
+        Assert.notEmpty(values, "values could not be empty!");
+        return in(condition, column, Arrays.stream(values).collect(toList()));
+    }
 
     /**
      * ignore
@@ -94,6 +142,8 @@ public interface Func<This, R> extends Serializable {
      * 字段 IN (v0, v1, ...)
      * 例: in("id", 1, 2, 3, 4, 5)
      *
+     * <li> 如果动态数组为 empty 则不会进行 sql 拼接 </li>
+     *
      * @param condition 执行条件
      * @param column    字段
      * @param values    数据数组
@@ -106,8 +156,30 @@ public interface Func<This, R> extends Serializable {
     /**
      * ignore
      */
-    default This notIn(R column, Collection<?> values) {
-        return notIn(true, column, values);
+    default This notIn(R column, Collection<?> coll) {
+        return notIn(true, column, coll);
+    }
+
+    /**
+     * ignore
+     */
+    default This notInOrThrow(R column, Collection<?> value) {
+        return notInOrThrow(true, column, value);
+    }
+
+    /**
+     * 字段 IN (value.get(0), value.get(1), ...)
+     * 例: in("id", Arrays.asList(1,2,3,4,5))
+     *
+     * <li> 如果集合为 empty 则直接抛出异常 </li>
+     *
+     * @param condition 执行条件
+     * @param column    字段
+     * @param coll      数据集合
+     */
+    default This notInOrThrow(boolean condition, R column, Collection<?> coll) {
+        Assert.notEmpty(coll, "coll could not be empty!");
+        return notIn(condition, column, coll);
     }
 
     /**
@@ -116,9 +188,9 @@ public interface Func<This, R> extends Serializable {
      *
      * @param condition 执行条件
      * @param column    字段
-     * @param value     数据集合
+     * @param coll      数据集合
      */
-    This notIn(boolean condition, R column, Collection<?> value);
+    This notIn(boolean condition, R column, Collection<?> coll);
 
     /**
      * ignore
@@ -127,6 +199,28 @@ public interface Func<This, R> extends Serializable {
         return notIn(true, column, value);
     }
 
+    /**
+     * ignore
+     */
+    default This notInOrThrow(R column, Object... values) {
+        return notInOrThrow(true, column, values);
+    }
+
+    /**
+     * 字段 IN (value.get(0), value.get(1), ...)
+     * 例: in("id", Arrays.asList(1,2,3,4,5))
+     *
+     * <li> 如果数组为 empty 则直接抛出异常 </li>
+     *
+     * @param condition 执行条件
+     * @param column    字段
+     * @param values    数据数组
+     */
+    default This notInOrThrow(boolean condition, R column, Object... values) {
+        Assert.notEmpty(values, "values could not be empty!");
+        return notIn(condition, column, Arrays.stream(values).collect(toList()));
+    }
+
     /**
      * 字段 NOT IN (v0, v1, ...)
      * 例: notIn("id", 1, 2, 3, 4, 5)