!273 fix:动态条件中 Predicate<T> 泛型问题

Merge pull request !273 from 王帅/main
This commit is contained in:
Michael Yang 2023-08-11 09:18:54 +00:00 committed by Gitee
commit 1cefe509bc
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
9 changed files with 378 additions and 102 deletions

View File

@ -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<R extends QueryModel<R>> {
return queryModel;
}
public <T> R eq(Object value, Predicate<T> when) {
public <T> R eq(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.eq(value, when), connector);
}
@ -60,8 +61,15 @@ public class WhereBuilder<R extends QueryModel<R>> {
return eq(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> R eq(LambdaGetter<T> value, Predicate<T> 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<R extends QueryModel<R>> {
return queryModel;
}
public <T> R ne(Object value, Predicate<T> when) {
public <T> R ne(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.ne(value, when), connector);
}
@ -82,8 +90,15 @@ public class WhereBuilder<R extends QueryModel<R>> {
return ne(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> R ne(LambdaGetter<T> value, Predicate<T> 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<R extends QueryModel<R>> {
return queryModel;
}
public <T> R like(Object value, Predicate<T> when) {
public <T> R like(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.like(value, when), connector);
}
@ -107,7 +122,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R likeLeft(Object value, Predicate<T> when) {
public <T> R likeLeft(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.likeLeft(value, when), connector);
}
@ -121,7 +136,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R likeRight(Object value, Predicate<T> when) {
public <T> R likeRight(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.likeRight(value, when), connector);
}
@ -135,7 +150,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R gt(Object value, Predicate<T> when) {
public <T> R gt(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.gt(value, when), connector);
}
@ -146,8 +161,15 @@ public class WhereBuilder<R extends QueryModel<R>> {
return gt(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> R gt(LambdaGetter<T> value, Predicate<T> 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<R extends QueryModel<R>> {
return queryModel;
}
public <T> R ge(Object value, Predicate<T> when) {
public <T> R ge(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.ge(value, when), connector);
}
@ -168,8 +190,15 @@ public class WhereBuilder<R extends QueryModel<R>> {
return ge(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> R ge(LambdaGetter<T> value, Predicate<T> 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<R extends QueryModel<R>> {
return queryModel;
}
public <T> R lt(Object value, Predicate<T> when) {
public <T> R lt(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.lt(value, when), connector);
}
@ -190,8 +219,15 @@ public class WhereBuilder<R extends QueryModel<R>> {
return lt(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> R lt(LambdaGetter<T> value, Predicate<T> 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<R extends QueryModel<R>> {
return queryModel;
}
public <T> R le(Object value, Predicate<T> when) {
public <T> R le(T value, Predicate<T> when) {
if (value != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.le(value, when), connector);
}
@ -212,8 +248,15 @@ public class WhereBuilder<R extends QueryModel<R>> {
return le(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> R le(LambdaGetter<T> value, Predicate<T> 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<R extends QueryModel<R>> {
return queryModel;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> R isNull(Predicate<T> when) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.isNull(when), connector);
return queryModel;
@ -231,6 +278,10 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> R isNotNull(Predicate<T> when) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.isNotNull(when), connector);
return queryModel;
@ -243,7 +294,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R in(Object[] arrays, Predicate<T> when) {
public <T> R in(T[] arrays, Predicate<T[]> when) {
//忽略 QueryWrapper.in("name", null) 的情况
if (arrays != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.in(arrays, when), connector);
@ -258,6 +309,10 @@ public class WhereBuilder<R extends QueryModel<R>> {
return this.queryModel;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> R in(R queryModel, Predicate<T> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.in(queryModel, when), connector);
@ -272,7 +327,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R in(Collection<?> collection, Predicate<T> when) {
public <T extends Collection<?>> R in(T collection, Predicate<T> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.in(collection, when), connector);
}
@ -286,7 +341,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R notIn(Object[] arrays, Predicate<T> when) {
public <T> R notIn(T[] arrays, Predicate<T[]> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notIn(arrays, when), connector);
}
@ -300,7 +355,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R notIn(Collection<?> collection, Predicate<T> when) {
public <T extends Collection<?>> R notIn(T collection, Predicate<T> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notIn(collection, when), connector);
}
@ -314,6 +369,10 @@ public class WhereBuilder<R extends QueryModel<R>> {
return this.queryModel;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> R notIn(R queryModel, Predicate<T> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notIn(queryModel, when), connector);
@ -328,7 +387,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R between(Object start, Object end, Predicate<T> when) {
public <S, E> R between(S start, E end, BiPredicate<S, E> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.between(start, end, when), connector);
}
@ -342,7 +401,7 @@ public class WhereBuilder<R extends QueryModel<R>> {
return queryModel;
}
public <T> R notBetween(Object start, Object end, Predicate<T> when) {
public <S, E> R notBetween(S start, E end, BiPredicate<S, E> when) {
if (queryModel != null) {
CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryColumn.notBetween(start, end, when), connector);
}

View File

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

View File

@ -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<QueryColumn> {
}
public <T> QueryCondition eq(Object value, Predicate<T> fn) {
public <T> QueryCondition eq(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value);
}
public <T> QueryCondition ne(Object value, Predicate<T> fn) {
public <T> QueryCondition ne(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%");
}
public <T> QueryCondition like(Object value, Predicate<T> fn) {
public <T> QueryCondition like(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.LIKE, value + "%");
}
public <T> QueryCondition likeLeft(Object value, Predicate<T> fn) {
public <T> QueryCondition likeLeft(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value);
}
public <T> QueryCondition likeRight(Object value, Predicate<T> fn) {
public <T> QueryCondition likeRight(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.LIKE, value);
}
public <T> QueryCondition likeRaw(Object value, Predicate<T> fn) {
public <T> QueryCondition likeRaw(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value + "%");
}
public <T> QueryCondition notLike(Object value, Predicate<T> fn) {
public <T> QueryCondition notLike(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.NOT_LIKE, value + "%");
}
public <T> QueryCondition notLikeLeft(Object value, Predicate<T> fn) {
public <T> QueryCondition notLikeLeft(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.NOT_LIKE, "%" + value);
}
public <T> QueryCondition notLikeRight(Object value, Predicate<T> fn) {
public <T> QueryCondition notLikeRight(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.GT, value);
}
public <T> QueryCondition gt(Object value, Predicate<T> fn) {
public <T> QueryCondition gt(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.GE, value);
}
public <T> QueryCondition ge(Object value, Predicate<T> fn) {
public <T> QueryCondition ge(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.LT, value);
}
public <T> QueryCondition lt(Object value, Predicate<T> fn) {
public <T> QueryCondition lt(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.LE, value);
}
public <T> QueryCondition le(Object value, Predicate<T> fn) {
public <T> QueryCondition le(T value, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.IS_NULL, null);
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> QueryCondition isNull(Predicate<T> fn) {
return QueryCondition.create(this, SqlConsts.IS_NULL, null).when(fn);
}
@ -390,6 +395,10 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null);
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> QueryCondition isNotNull(Predicate<T> fn) {
return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null).when(fn);
}
@ -415,7 +424,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
}
public <T> QueryCondition in(Object[] arrays, Predicate<T> fn) {
public <T> QueryCondition in(T[] arrays, Predicate<T[]> 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<QueryColumn> {
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<QueryColumn> {
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> QueryCondition in(QueryWrapper queryWrapper, Predicate<T> fn) {
if (queryWrapper == null || QueryColumnBehavior.shouldIgnoreValue(queryWrapper)) {
return QueryCondition.createEmpty();
@ -457,17 +470,17 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @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 <T> QueryCondition in(Collection<?> collection, Predicate<T> fn) {
if (collection != null && !collection.isEmpty() && !QueryColumnBehavior.shouldIgnoreValue(collection)) {
return in(collection.toArray(), fn);
public <T extends Collection<?>> QueryCondition in(T collection, Predicate<T> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.NOT_IN, arrays);
}
public <T> QueryCondition notIn(Object[] arrays, Predicate<T> fn) {
public <T> QueryCondition notIn(T[] arrays, Predicate<T[]> 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<QueryColumn> {
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<QueryColumn> {
* @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 <T> QueryCondition notIn(Collection<?> collection, Predicate<T> fn) {
if (collection != null && !collection.isEmpty() && !QueryColumnBehavior.shouldIgnoreValue(collection)) {
return notIn(collection.toArray(), fn);
public <T extends Collection<?>> QueryCondition notIn(T collection, Predicate<T> 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<QueryColumn> {
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> QueryCondition notIn(QueryWrapper queryWrapper, Predicate<T> fn) {
if (queryWrapper == null || QueryColumnBehavior.shouldIgnoreValue(queryWrapper)) {
return QueryCondition.createEmpty();
@ -554,8 +571,8 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end});
}
public <T> QueryCondition between(Object start, Object end, Predicate<T> fn) {
return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end}).when(fn);
public <S, E> QueryCondition between(S start, E end, BiPredicate<S, E> 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<QueryColumn> {
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end});
}
public <T> QueryCondition notBetween(Object start, Object end, Predicate<T> fn) {
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}).when(fn);
public <S, E> QueryCondition notBetween(S start, E end, BiPredicate<S, E> fn) {
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}).when(fn.test(start, end));
}

View File

@ -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<QueryCondition> {
@ -96,17 +96,44 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
this.logic = logic;
}
/**
* 动态条件构造
*
* @param effective 是否启用该条件
* @return {@link QueryCondition}
*/
public QueryCondition when(boolean effective) {
this.effective = effective;
return this;
}
public void when(Supplier<Boolean> 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;
}
/**
* <p>动态条件构造
*
* <p>推荐将 {@link Predicate} 推断写在填写的值的后面以确保泛型对应例如
* <pre>{@code
* ACCOUNT.ID.in(idList, CollectionUtil::isNotEmpty);
* }</pre>
*
* @see #when(boolean)
* @see #when(BooleanSupplier)
* @deprecated 由于 {@link QueryCondition} 中属性 {@link #value} 的类型为 Object
* 类型没有使用泛型所以该方法泛型推断可能会出现问题
*/
@Deprecated
@SuppressWarnings("unchecked")
public <T> QueryCondition when(Predicate<T> fn) {
Object val = this.value;
if ((SqlConsts.LIKE.equals(logic) || SqlConsts.NOT_LIKE.equals(logic))

View File

@ -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<Wrapper extends QueryWrapper> {
@ -47,7 +48,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
}
public <T> Wrapper eq(Object value, Predicate<T> when) {
public <T> Wrapper eq(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.eq(value, when), connector);
}
@ -59,9 +60,15 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return eq(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> Wrapper eq(LambdaGetter<T> value, Predicate<T> 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<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper ne(Object value, Predicate<T> when) {
public <T> Wrapper ne(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.ne(value, when), connector);
}
@ -89,8 +96,15 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> Wrapper ne(LambdaGetter<T> value, Predicate<T> 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<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper like(Object value, Predicate<T> when) {
public <T> Wrapper like(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.like(value, when), connector);
}
@ -121,7 +135,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper likeLeft(Object value, Predicate<T> when) {
public <T> Wrapper likeLeft(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.likeLeft(value, when), connector);
}
@ -136,7 +150,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper likeRight(Object value, Predicate<T> when) {
public <T> Wrapper likeRight(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.likeRight(value, when), connector);
}
@ -155,7 +169,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper gt(Object value, Predicate<T> when) {
public <T> Wrapper gt(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.gt(value, when), connector);
}
@ -166,9 +180,15 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return gt(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> Wrapper gt(LambdaGetter<T> value, Predicate<T> 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<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper ge(Object value, Predicate<T> when) {
public <T> Wrapper ge(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.ge(value, when), connector);
}
@ -195,9 +215,15 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return ge(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> Wrapper ge(LambdaGetter<T> value, Predicate<T> 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<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper lt(Object value, Predicate<T> when) {
public <T> Wrapper lt(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.lt(value, when), connector);
}
@ -223,9 +249,15 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return lt(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> Wrapper lt(LambdaGetter<T> value, Predicate<T> 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<Wrapper extends QueryWrapper> {
}
public <T> Wrapper le(Object value, Predicate<T> when) {
public <T> Wrapper le(T value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.le(value, when), connector);
}
@ -252,9 +284,15 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return le(LambdaUtil.getQueryColumn(value));
}
/**
* @deprecated {@link Predicate} 泛型参数无效
*/
@Deprecated
public <T> Wrapper le(LambdaGetter<T> value, Predicate<T> 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<Wrapper extends QueryWrapper> {
return queryWrapper;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> Wrapper isNull(Predicate<T> when) {
queryWrapper.addWhereQueryCondition(queryColumn.isNull(when), connector);
return queryWrapper;
@ -284,6 +326,10 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> Wrapper isNotNull(Predicate<T> when) {
queryWrapper.addWhereQueryCondition(queryColumn.isNotNull(when), connector);
return queryWrapper;
@ -303,7 +349,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper in(Object[] arrays, Predicate<T> when) {
public <T> Wrapper in(T[] arrays, Predicate<T[]> when) {
//忽略 QueryWrapper.in("name", null) 的情况
if (arrays != null) {
queryWrapper.addWhereQueryCondition(queryColumn.in(arrays, when), connector);
@ -324,6 +370,10 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return this.queryWrapper;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> Wrapper in(QueryWrapper queryWrapper, Predicate<T> when) {
if (queryWrapper != null) {
this.queryWrapper.addWhereQueryCondition(queryColumn.in(queryWrapper, when), connector);
@ -345,7 +395,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper in(Collection<?> collection, Predicate<T> when) {
public <T extends Collection<?>> Wrapper in(T collection, Predicate<T> when) {
if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.in(collection, when), connector);
}
@ -365,7 +415,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper notIn(Object[] arrays, Predicate<T> when) {
public <T> Wrapper notIn(T[] arrays, Predicate<T[]> when) {
if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.notIn(arrays, when), connector);
}
@ -386,7 +436,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper notIn(Collection<?> collection, Predicate<T> when) {
public <T extends Collection<?>> Wrapper notIn(T collection, Predicate<T> when) {
if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.notIn(collection, when), connector);
}
@ -405,6 +455,10 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return this.queryWrapper;
}
/**
* @deprecated 无法推断泛型
*/
@Deprecated
public <T> Wrapper notIn(QueryWrapper queryWrapper, Predicate<T> when) {
if (queryWrapper != null) {
this.queryWrapper.addWhereQueryCondition(queryColumn.notIn(queryWrapper, when), connector);
@ -427,7 +481,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
}
public <T> Wrapper between(Object start, Object end, Predicate<T> when) {
public <S, E> Wrapper between(S start, E end, BiPredicate<S, E> when) {
if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.between(start, end, when), connector);
}
@ -448,7 +502,7 @@ public class QueryConditionBuilder<Wrapper extends QueryWrapper> {
return queryWrapper;
}
public <T> Wrapper notBetween(Object start, Object end, Predicate<T> when) {
public <S, E> Wrapper notBetween(S start, E end, BiPredicate<S, E> when) {
if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.notBetween(start, end, when), connector);
}

View File

@ -291,7 +291,7 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
}
public QueryWrapper or(Consumer<QueryWrapper> consumer, boolean condition) {
if (condition) {
if (!condition) {
return this;
}
QueryWrapper newWrapper = new QueryWrapper();

View File

@ -0,0 +1,82 @@
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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<Integer> 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);
}
}

View File

@ -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<Good> {
@Id(keyType = KeyType.Auto)

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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;
}
}