diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java index c87378c2..d8b1e30e 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java @@ -22,6 +22,7 @@ import com.mybatisflex.core.util.LambdaGetter; import com.mybatisflex.core.util.LambdaUtil; import java.util.Collection; +import java.util.function.BiPredicate; import java.util.function.Predicate; /** @@ -49,7 +50,7 @@ public class WhereBuilder> { return queryModel; } - public R eq(Object value, Predicate when) { + public R eq(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.eq(value, when), connector); } @@ -60,8 +61,15 @@ public class WhereBuilder> { return eq(LambdaUtil.getQueryColumn(value)); } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public R eq(LambdaGetter value, Predicate when) { - return eq(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.eq(LambdaUtil.getQueryColumn(value)).when(when), connector); + } + return queryModel; } public R ne(Object value) { @@ -71,7 +79,7 @@ public class WhereBuilder> { return queryModel; } - public R ne(Object value, Predicate when) { + public R ne(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.ne(value, when), connector); } @@ -82,8 +90,15 @@ public class WhereBuilder> { return ne(LambdaUtil.getQueryColumn(value)); } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public R ne(LambdaGetter value, Predicate when) { - return ne(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.ne(LambdaUtil.getQueryColumn(value)).when(when), connector); + } + return queryModel; } public R like(Object value) { @@ -93,7 +108,7 @@ public class WhereBuilder> { return queryModel; } - public R like(Object value, Predicate when) { + public R like(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.like(value, when), connector); } @@ -107,7 +122,7 @@ public class WhereBuilder> { return queryModel; } - public R likeLeft(Object value, Predicate when) { + public R likeLeft(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.likeLeft(value, when), connector); } @@ -121,7 +136,7 @@ public class WhereBuilder> { return queryModel; } - public R likeRight(Object value, Predicate when) { + public R likeRight(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.likeRight(value, when), connector); } @@ -135,7 +150,7 @@ public class WhereBuilder> { return queryModel; } - public R gt(Object value, Predicate when) { + public R gt(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.gt(value, when), connector); } @@ -146,8 +161,15 @@ public class WhereBuilder> { return gt(LambdaUtil.getQueryColumn(value)); } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public R gt(LambdaGetter value, Predicate when) { - return gt(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.gt(LambdaUtil.getQueryColumn(value)).when(when), connector); + } + return queryModel; } public R ge(Object value) { @@ -157,7 +179,7 @@ public class WhereBuilder> { return queryModel; } - public R ge(Object value, Predicate when) { + public R ge(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.ge(value, when), connector); } @@ -168,8 +190,15 @@ public class WhereBuilder> { return ge(LambdaUtil.getQueryColumn(value)); } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public R ge(LambdaGetter value, Predicate when) { - return ge(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.ge(LambdaUtil.getQueryColumn(value)).when(when), connector); + } + return queryModel; } public R lt(Object value) { @@ -179,7 +208,7 @@ public class WhereBuilder> { return queryModel; } - public R lt(Object value, Predicate when) { + public R lt(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.lt(value, when), connector); } @@ -190,8 +219,15 @@ public class WhereBuilder> { return lt(LambdaUtil.getQueryColumn(value)); } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public R lt(LambdaGetter value, Predicate when) { - return lt(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.lt(LambdaUtil.getQueryColumn(value)).when(when), connector); + } + return queryModel; } public R le(Object value) { @@ -201,7 +237,7 @@ public class WhereBuilder> { return queryModel; } - public R le(Object value, Predicate when) { + public R le(T value, Predicate when) { if (value != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.le(value, when), connector); } @@ -212,8 +248,15 @@ public class WhereBuilder> { return le(LambdaUtil.getQueryColumn(value)); } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public R le(LambdaGetter value, Predicate when) { - return le(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.le(LambdaUtil.getQueryColumn(value)).when(when), connector); + } + return queryModel; } public R isNull() { @@ -221,6 +264,10 @@ public class WhereBuilder> { return queryModel; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public R isNull(Predicate when) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.isNull(when), connector); return queryModel; @@ -231,6 +278,10 @@ public class WhereBuilder> { return queryModel; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public R isNotNull(Predicate when) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.isNotNull(when), connector); return queryModel; @@ -243,7 +294,7 @@ public class WhereBuilder> { return queryModel; } - public R in(Object[] arrays, Predicate when) { + public R in(T[] arrays, Predicate when) { //忽略 QueryWrapper.in("name", null) 的情况 if (arrays != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.in(arrays, when), connector); @@ -258,6 +309,10 @@ public class WhereBuilder> { return this.queryModel; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public R in(R queryModel, Predicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.in(queryModel, when), connector); @@ -272,7 +327,7 @@ public class WhereBuilder> { return queryModel; } - public R in(Collection collection, Predicate when) { + public > R in(T collection, Predicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.in(collection, when), connector); } @@ -286,7 +341,7 @@ public class WhereBuilder> { return queryModel; } - public R notIn(Object[] arrays, Predicate when) { + public R notIn(T[] arrays, Predicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notIn(arrays, when), connector); } @@ -300,7 +355,7 @@ public class WhereBuilder> { return queryModel; } - public R notIn(Collection collection, Predicate when) { + public > R notIn(T collection, Predicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notIn(collection, when), connector); } @@ -314,6 +369,10 @@ public class WhereBuilder> { return this.queryModel; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public R notIn(R queryModel, Predicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notIn(queryModel, when), connector); @@ -328,7 +387,7 @@ public class WhereBuilder> { return queryModel; } - public R between(Object start, Object end, Predicate when) { + public R between(S start, E end, BiPredicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.between(start, end, when), connector); } @@ -342,7 +401,7 @@ public class WhereBuilder> { return queryModel; } - public R notBetween(Object start, Object end, Predicate when) { + public R notBetween(S start, E end, BiPredicate when) { if (queryModel != null) { CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notBetween(start, end, when), connector); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/If.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/If.java index 9bb95177..7772f2b7 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/If.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/If.java @@ -45,7 +45,9 @@ public class If { * 查看某个对象是否为空,支持数组、集合、map 等 * * @param object + * @deprecated 无泛型,多 instanceof 判断 */ + @Deprecated public static boolean notEmpty(Object object) { if (object == null) { return false; @@ -74,7 +76,9 @@ public class If { * 查看某个对象是否为空数据 或者 null * * @param object + * @deprecated 无泛型,多 instanceof 判断 */ + @Deprecated public static boolean isEmpty(Object object) { return !notEmpty(object); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java index 8b33f47d..2222ea52 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java @@ -24,6 +24,7 @@ import com.mybatisflex.core.util.*; import java.util.Collection; import java.util.List; +import java.util.function.BiPredicate; import java.util.function.Predicate; /** @@ -147,11 +148,11 @@ public class QueryColumn implements CloneSupport { } - public QueryCondition eq(Object value, Predicate fn) { + public QueryCondition eq(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.EQUALS, value).when(fn); + return QueryCondition.create(this, SqlConsts.EQUALS, value).when(fn.test(value)); } @@ -167,11 +168,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value); } - public QueryCondition ne(Object value, Predicate fn) { + public QueryCondition ne(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value).when(fn); + return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value).when(fn.test(value)); } @@ -187,11 +188,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%"); } - public QueryCondition like(Object value, Predicate fn) { + public QueryCondition like(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%").when(fn); + return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%").when(fn.test(value)); } @@ -202,11 +203,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.LIKE, value + "%"); } - public QueryCondition likeLeft(Object value, Predicate fn) { + public QueryCondition likeLeft(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.LIKE, value + "%").when(fn); + return QueryCondition.create(this, SqlConsts.LIKE, value + "%").when(fn.test(value)); } @@ -217,11 +218,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.LIKE, "%" + value); } - public QueryCondition likeRight(Object value, Predicate fn) { + public QueryCondition likeRight(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.LIKE, "%" + value).when(fn); + return QueryCondition.create(this, SqlConsts.LIKE, "%" + value).when(fn.test(value)); } @@ -232,11 +233,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.LIKE, value); } - public QueryCondition likeRaw(Object value, Predicate fn) { + public QueryCondition likeRaw(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.LIKE, value).when(fn); + return QueryCondition.create(this, SqlConsts.LIKE, value).when(fn.test(value)); } @@ -252,11 +253,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value + "%"); } - public QueryCondition notLike(Object value, Predicate fn) { + public QueryCondition notLike(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value + "%").when(fn); + return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value + "%").when(fn.test(value)); } @@ -267,11 +268,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_LIKE, value + "%"); } - public QueryCondition notLikeLeft(Object value, Predicate fn) { + public QueryCondition notLikeLeft(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.NOT_LIKE, value + "%").when(fn); + return QueryCondition.create(this, SqlConsts.NOT_LIKE, value + "%").when(fn.test(value)); } @@ -282,11 +283,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value); } - public QueryCondition notLikeRight(Object value, Predicate fn) { + public QueryCondition notLikeRight(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value).when(fn); + return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value).when(fn.test(value)); } @@ -302,11 +303,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.GT, value); } - public QueryCondition gt(Object value, Predicate fn) { + public QueryCondition gt(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.GT, value).when(fn); + return QueryCondition.create(this, SqlConsts.GT, value).when(fn.test(value)); } /** @@ -321,11 +322,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.GE, value); } - public QueryCondition ge(Object value, Predicate fn) { + public QueryCondition ge(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.GE, value).when(fn); + return QueryCondition.create(this, SqlConsts.GE, value).when(fn.test(value)); } /** @@ -340,11 +341,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.LT, value); } - public QueryCondition lt(Object value, Predicate fn) { + public QueryCondition lt(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.LT, value).when(fn); + return QueryCondition.create(this, SqlConsts.LT, value).when(fn.test(value)); } /** @@ -359,11 +360,11 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.LE, value); } - public QueryCondition le(Object value, Predicate fn) { + public QueryCondition le(T value, Predicate fn) { if (value == null || QueryColumnBehavior.shouldIgnoreValue(value)) { return QueryCondition.createEmpty(); } - return QueryCondition.create(this, SqlConsts.LE, value).when(fn); + return QueryCondition.create(this, SqlConsts.LE, value).when(fn.test(value)); } @@ -376,6 +377,10 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.IS_NULL, null); } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public QueryCondition isNull(Predicate fn) { return QueryCondition.create(this, SqlConsts.IS_NULL, null).when(fn); } @@ -390,6 +395,10 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null); } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public QueryCondition isNotNull(Predicate fn) { return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null).when(fn); } @@ -415,7 +424,7 @@ public class QueryColumn implements CloneSupport { } - public QueryCondition in(Object[] arrays, Predicate fn) { + public QueryCondition in(T[] arrays, Predicate fn) { //忽略 QueryWrapper.in("name", null) 的情况 if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null) || QueryColumnBehavior.shouldIgnoreValue(arrays)) { return QueryCondition.createEmpty(); @@ -425,7 +434,7 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.EQUALS, arrays[0]); } - return QueryCondition.create(this, SqlConsts.IN, arrays).when(fn); + return QueryCondition.create(this, SqlConsts.IN, arrays).when(fn.test(arrays)); } /** @@ -442,6 +451,10 @@ public class QueryColumn implements CloneSupport { } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public QueryCondition in(QueryWrapper queryWrapper, Predicate fn) { if (queryWrapper == null || QueryColumnBehavior.shouldIgnoreValue(queryWrapper)) { return QueryCondition.createEmpty(); @@ -457,17 +470,17 @@ public class QueryColumn implements CloneSupport { * @return QueryCondition */ public QueryCondition in(Collection collection) { - if (collection != null && !collection.isEmpty() && !QueryColumnBehavior.shouldIgnoreValue(collection)) { - return in(collection.toArray()); + if (collection == null || collection.isEmpty() || QueryColumnBehavior.shouldIgnoreValue(collection)) { + return QueryCondition.createEmpty(); } - return QueryCondition.createEmpty(); + return in(collection.toArray()); } - public QueryCondition in(Collection collection, Predicate fn) { - if (collection != null && !collection.isEmpty() && !QueryColumnBehavior.shouldIgnoreValue(collection)) { - return in(collection.toArray(), fn); + public > QueryCondition in(T collection, Predicate fn) { + if (collection == null || collection.isEmpty() || QueryColumnBehavior.shouldIgnoreValue(collection)) { + return QueryCondition.createEmpty(); } - return QueryCondition.createEmpty(); + return in(collection.toArray()).when(fn.test(collection)); } /** @@ -489,7 +502,7 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_IN, arrays); } - public QueryCondition notIn(Object[] arrays, Predicate fn) { + public QueryCondition notIn(T[] arrays, Predicate fn) { //忽略 QueryWrapper.notIn("name", null) 的情况 if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null) || QueryColumnBehavior.shouldIgnoreValue(arrays)) { return QueryCondition.createEmpty(); @@ -499,7 +512,7 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_EQUALS, arrays[0]); } - return QueryCondition.create(this, SqlConsts.NOT_IN, arrays).when(fn); + return QueryCondition.create(this, SqlConsts.NOT_IN, arrays).when(fn.test(arrays)); } @@ -510,17 +523,17 @@ public class QueryColumn implements CloneSupport { * @return QueryCondition */ public QueryCondition notIn(Collection collection) { - if (collection != null && !collection.isEmpty() && !QueryColumnBehavior.shouldIgnoreValue(collection)) { - return notIn(collection.toArray()); + if (collection == null || collection.isEmpty() || QueryColumnBehavior.shouldIgnoreValue(collection)) { + return QueryCondition.createEmpty(); } - return QueryCondition.createEmpty(); + return notIn(collection.toArray()); } - public QueryCondition notIn(Collection collection, Predicate fn) { - if (collection != null && !collection.isEmpty() && !QueryColumnBehavior.shouldIgnoreValue(collection)) { - return notIn(collection.toArray(), fn); + public > QueryCondition notIn(T collection, Predicate fn) { + if (collection == null || collection.isEmpty() || QueryColumnBehavior.shouldIgnoreValue(collection)) { + return QueryCondition.createEmpty(); } - return QueryCondition.createEmpty(); + return notIn(collection.toArray()).when(fn.test(collection)); } /** @@ -536,6 +549,10 @@ public class QueryColumn implements CloneSupport { } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public QueryCondition notIn(QueryWrapper queryWrapper, Predicate fn) { if (queryWrapper == null || QueryColumnBehavior.shouldIgnoreValue(queryWrapper)) { return QueryCondition.createEmpty(); @@ -554,8 +571,8 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end}); } - public QueryCondition between(Object start, Object end, Predicate fn) { - return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end}).when(fn); + public QueryCondition between(S start, E end, BiPredicate fn) { + return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end}).when(fn.test(start, end)); } @@ -569,8 +586,8 @@ public class QueryColumn implements CloneSupport { return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}); } - public QueryCondition notBetween(Object start, Object end, Predicate fn) { - return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}).when(fn); + public QueryCondition notBetween(S start, E end, BiPredicate fn) { + return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}).when(fn.test(start, end)); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java index 2fd57ddd..41929339 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java @@ -24,8 +24,8 @@ import com.mybatisflex.core.util.ObjectUtil; import java.lang.reflect.Array; import java.util.List; +import java.util.function.BooleanSupplier; import java.util.function.Predicate; -import java.util.function.Supplier; public class QueryCondition implements CloneSupport { @@ -96,17 +96,44 @@ public class QueryCondition implements CloneSupport { this.logic = logic; } - + /** + * 动态条件构造。 + * + * @param effective 是否启用该条件 + * @return {@link QueryCondition} + */ public QueryCondition when(boolean effective) { this.effective = effective; return this; } - public void when(Supplier fn) { - Boolean effective = fn.get(); - this.effective = (effective != null && effective); + + /** + * 动态条件构造。 + * + * @param fn 是否启用该条件 + * @return {@link QueryCondition} + */ + public QueryCondition when(BooleanSupplier fn) { + this.effective = fn.getAsBoolean(); + return this; } + /** + *

动态条件构造。 + * + *

推荐将 {@link Predicate} 推断写在填写的值的后面,以确保泛型对应,例如: + *

{@code
+     * ACCOUNT.ID.in(idList, CollectionUtil::isNotEmpty);
+     * }
+ * + * @see #when(boolean) + * @see #when(BooleanSupplier) + * @deprecated 由于 {@link QueryCondition} 中属性 {@link #value} 的类型为 Object + * 类型,没有使用泛型,所以该方法泛型推断可能会出现问题。 + */ + @Deprecated + @SuppressWarnings("unchecked") public QueryCondition when(Predicate fn) { Object val = this.value; if ((SqlConsts.LIKE.equals(logic) || SqlConsts.NOT_LIKE.equals(logic)) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryConditionBuilder.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryConditionBuilder.java index 2baf3253..fe8714e8 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryConditionBuilder.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryConditionBuilder.java @@ -19,6 +19,7 @@ import com.mybatisflex.core.util.LambdaGetter; import com.mybatisflex.core.util.LambdaUtil; import java.util.Collection; +import java.util.function.BiPredicate; import java.util.function.Predicate; public class QueryConditionBuilder { @@ -47,7 +48,7 @@ public class QueryConditionBuilder { } - public Wrapper eq(Object value, Predicate when) { + public Wrapper eq(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.eq(value, when), connector); } @@ -59,9 +60,15 @@ public class QueryConditionBuilder { return eq(LambdaUtil.getQueryColumn(value)); } - + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public Wrapper eq(LambdaGetter value, Predicate when) { - return eq(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + queryWrapper.addWhereQueryCondition(queryColumn.eq(value).when(when), connector); + } + return queryWrapper; } @@ -77,7 +84,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper ne(Object value, Predicate when) { + public Wrapper ne(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.ne(value, when), connector); } @@ -89,8 +96,15 @@ public class QueryConditionBuilder { } + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public Wrapper ne(LambdaGetter value, Predicate when) { - return ne(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + queryWrapper.addWhereQueryCondition(queryColumn.ne(value).when(when), connector); + } + return queryWrapper; } @@ -106,7 +120,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper like(Object value, Predicate when) { + public Wrapper like(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.like(value, when), connector); } @@ -121,7 +135,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper likeLeft(Object value, Predicate when) { + public Wrapper likeLeft(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.likeLeft(value, when), connector); } @@ -136,7 +150,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper likeRight(Object value, Predicate when) { + public Wrapper likeRight(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.likeRight(value, when), connector); } @@ -155,7 +169,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper gt(Object value, Predicate when) { + public Wrapper gt(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.gt(value, when), connector); } @@ -166,9 +180,15 @@ public class QueryConditionBuilder { return gt(LambdaUtil.getQueryColumn(value)); } - + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public Wrapper gt(LambdaGetter value, Predicate when) { - return gt(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + queryWrapper.addWhereQueryCondition(queryColumn.gt(value).when(when), connector); + } + return queryWrapper; } @@ -184,7 +204,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper ge(Object value, Predicate when) { + public Wrapper ge(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.ge(value, when), connector); } @@ -195,9 +215,15 @@ public class QueryConditionBuilder { return ge(LambdaUtil.getQueryColumn(value)); } - + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public Wrapper ge(LambdaGetter value, Predicate when) { - return ge(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + queryWrapper.addWhereQueryCondition(queryColumn.ge(value).when(when), connector); + } + return queryWrapper; } /** @@ -212,7 +238,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper lt(Object value, Predicate when) { + public Wrapper lt(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.lt(value, when), connector); } @@ -223,9 +249,15 @@ public class QueryConditionBuilder { return lt(LambdaUtil.getQueryColumn(value)); } - + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public Wrapper lt(LambdaGetter value, Predicate when) { - return lt(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + queryWrapper.addWhereQueryCondition(queryColumn.lt(value).when(when), connector); + } + return queryWrapper; } /** @@ -241,7 +273,7 @@ public class QueryConditionBuilder { } - public Wrapper le(Object value, Predicate when) { + public Wrapper le(T value, Predicate when) { if (value != null) { queryWrapper.addWhereQueryCondition(queryColumn.le(value, when), connector); } @@ -252,9 +284,15 @@ public class QueryConditionBuilder { return le(LambdaUtil.getQueryColumn(value)); } - + /** + * @deprecated {@link Predicate} 泛型参数无效 + */ + @Deprecated public Wrapper le(LambdaGetter value, Predicate when) { - return le(LambdaUtil.getQueryColumn(value), when); + if (value != null) { + queryWrapper.addWhereQueryCondition(queryColumn.le(value).when(when), connector); + } + return queryWrapper; } @@ -268,6 +306,10 @@ public class QueryConditionBuilder { return queryWrapper; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public Wrapper isNull(Predicate when) { queryWrapper.addWhereQueryCondition(queryColumn.isNull(when), connector); return queryWrapper; @@ -284,6 +326,10 @@ public class QueryConditionBuilder { return queryWrapper; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public Wrapper isNotNull(Predicate when) { queryWrapper.addWhereQueryCondition(queryColumn.isNotNull(when), connector); return queryWrapper; @@ -303,7 +349,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper in(Object[] arrays, Predicate when) { + public Wrapper in(T[] arrays, Predicate when) { //忽略 QueryWrapper.in("name", null) 的情况 if (arrays != null) { queryWrapper.addWhereQueryCondition(queryColumn.in(arrays, when), connector); @@ -324,6 +370,10 @@ public class QueryConditionBuilder { return this.queryWrapper; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public Wrapper in(QueryWrapper queryWrapper, Predicate when) { if (queryWrapper != null) { this.queryWrapper.addWhereQueryCondition(queryColumn.in(queryWrapper, when), connector); @@ -345,7 +395,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper in(Collection collection, Predicate when) { + public > Wrapper in(T collection, Predicate when) { if (queryWrapper != null) { queryWrapper.addWhereQueryCondition(queryColumn.in(collection, when), connector); } @@ -365,7 +415,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper notIn(Object[] arrays, Predicate when) { + public Wrapper notIn(T[] arrays, Predicate when) { if (queryWrapper != null) { queryWrapper.addWhereQueryCondition(queryColumn.notIn(arrays, when), connector); } @@ -386,7 +436,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper notIn(Collection collection, Predicate when) { + public > Wrapper notIn(T collection, Predicate when) { if (queryWrapper != null) { queryWrapper.addWhereQueryCondition(queryColumn.notIn(collection, when), connector); } @@ -405,6 +455,10 @@ public class QueryConditionBuilder { return this.queryWrapper; } + /** + * @deprecated 无法推断泛型 + */ + @Deprecated public Wrapper notIn(QueryWrapper queryWrapper, Predicate when) { if (queryWrapper != null) { this.queryWrapper.addWhereQueryCondition(queryColumn.notIn(queryWrapper, when), connector); @@ -427,7 +481,7 @@ public class QueryConditionBuilder { } - public Wrapper between(Object start, Object end, Predicate when) { + public Wrapper between(S start, E end, BiPredicate when) { if (queryWrapper != null) { queryWrapper.addWhereQueryCondition(queryColumn.between(start, end, when), connector); } @@ -448,7 +502,7 @@ public class QueryConditionBuilder { return queryWrapper; } - public Wrapper notBetween(Object start, Object end, Predicate when) { + public Wrapper notBetween(S start, E end, BiPredicate when) { if (queryWrapper != null) { queryWrapper.addWhereQueryCondition(queryColumn.notBetween(start, end, when), connector); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java index 661a16ed..2f40a6fc 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryWrapper.java @@ -291,7 +291,7 @@ public class QueryWrapper extends BaseQueryWrapper { } public QueryWrapper or(Consumer consumer, boolean condition) { - if (condition) { + if (!condition) { return this; } QueryWrapper newWrapper = new QueryWrapper(); diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/DynamicConditionTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/DynamicConditionTest.java new file mode 100644 index 00000000..ce020d6d --- /dev/null +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/DynamicConditionTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.coretest; + +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.util.CollectionUtil; +import com.mybatisflex.core.util.StringUtil; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; + +/** + * 动态条件测试。 + * + * @author 王帅 + * @since 2023-08-10 + */ +public class DynamicConditionTest { + + @Test + public void test01() { + String sql = QueryWrapper.create() + .from(ACCOUNT) + .where(ACCOUNT.AGE.ge(18)) + .or(qw -> qw.where(ACCOUNT.ID.eq(1)), false) + .toSQL(); + + System.out.println(sql); + } + + @Test + public void test02() { + List idList = Arrays.asList(1, 2, 3); + + String sql = QueryWrapper.create() + .from(ACCOUNT) + .where(ACCOUNT.ID.in(idList).when(false)) + .where(ACCOUNT.ID.in(idList, CollectionUtil::isNotEmpty)) + .where(ACCOUNT.ID.in(idList).when(idList::isEmpty)) + .toSQL(); + + System.out.println(sql); + } + + @Test + public void test03() { + String sql = QueryWrapper.create() + .from(ACCOUNT) + .where(ACCOUNT.ID.eq("1", StringUtil::isNumeric)) + .toSQL(); + + System.out.println(sql); + } + + @Test + public void test04() { + String sql = QueryWrapper.create() + .from(ACCOUNT) + .where(ACCOUNT.ID.between('1', '2', (start, end) -> start < end)) + .toSQL(); + + System.out.println(sql); + } + +} diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java index e95742c9..116ebe7a 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/Good.java @@ -29,7 +29,7 @@ import java.util.Objects; * @author 王帅 * @since 2023-06-07 */ -@Table("tb_good") +@Table(value = "tb_good", onSet = GoodOnSetListener.class) public class Good extends Model { @Id(keyType = KeyType.Auto) diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/GoodOnSetListener.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/GoodOnSetListener.java new file mode 100644 index 00000000..9585ebca --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/model/GoodOnSetListener.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.test.model; + +import com.mybatisflex.annotation.SetListener; + +/** + * @author 王帅 + * @since 2023-08-11 + */ +public class GoodOnSetListener implements SetListener { + + @Override + public Object onSet(Object entity, String property, Object value) { + System.out.println("Good: " + property + " --- " + value); + return null; + } + +}