mybatis-plus in查询条件超过1000条报错
mybatis-plus in条件超过1000条解决方案
·
mybatis-plus in查询条件超过1000条报错
说明
数据库中 IN 可以包含的选项数如下:
mysql数据库:in语句中参数个数是不限制的。不过对整段sql语句的长度有了限制,
8.0之前的版本默认4M,最大可设置为1G;
8.0版本之后默认64M,最大可设置1G (设置max_allowed_packet修改默认大小)。
Oracle数据库:9i(最多256条)、10g(最多1000条)、 11g(最多1000条)
mybatis-plus in条件超过1000条时报错解决方案:
我们采取的是 截取in条件的方案,例如 select*from test where name in () or name in (),具体如下:
1.新建参数截取的工具类
package com.spsolution.hera.parent.jdbc.util;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import org.apache.commons.lang3.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author xhb 2022-01-07
**/
public class MybatisParameterUtils {
public static <T, F> void cutInParameter(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.in(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().in(column, objects);
}
});
}
public static <T, F> void cutNotInParameter(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.notIn(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().notIn(column, objects);
}
});
}
public static <T, F> void cutInParameter(LambdaQueryChainWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.in(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().in(column, objects);
}
});
}
public static <T, F> void cutNotInParameter(LambdaQueryChainWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.notIn(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().notIn(column, objects);
}
});
}
public static <T, F> void cutInParameter(LambdaUpdateWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.in(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().in(column, objects);
}
});
}
public static <T, F> void cutNotInParameter(LambdaUpdateWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.notIn(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().notIn(column, objects);
}
});
}
public static <T, F> void cutInParameter(LambdaUpdateChainWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.in(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().in(column, objects);
}
});
}
public static <T, F> void cutNotInParameter(LambdaUpdateChainWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws Exception {
List<List<F>> newList = splitList(coll, 900);
if (ObjectUtils.isEmpty(newList)) {
throw new Exception("参数错误");
} else if (newList.size() == 1) {
wrapper.notIn(column, newList.get(0));
return;
}
wrapper.and(i -> {
i.in(column, newList.get(0));
newList.remove(0);
for (List<F> objects : newList) {
i.or().notIn(column, objects);
}
});
}
public static <F> List<List<F>> splitList(List<F> list, int groupSize) {
int length = list.size();
// 计算可以分成多少组
int num = (length + groupSize - 1) / groupSize;
List<List<F>> newList = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
// 开始位置
int fromIndex = i * groupSize;
// 结束位置
int toIndex = Math.min((i + 1) * groupSize, length);
newList.add(list.subList(fromIndex, toIndex));
}
return newList;
}
}
2.方法中引用
//条件构造器
LambdaQueryWrapper<TXxytEnterpriseInfo> queryWrapper = new LambdaQueryWrapper<>();
//普通字段查询
queryWrapper.eq(!StringUtils.isEmpty(enterForm.getHylbdm()),TXxytEnterpriseInfo::getHylbdm,enterForm.getHylbdm());
//调用工具类重新拼装in条件 (条件wrapper, get方法的方法引用, 参数list)
MybatisParameterUtils.cutInParameter(queryWrapper,TXxytEnterpriseInfo::getOrgId, orgIdList);
List<TXxytEnterpriseInfo> list = this.list(queryWrapper);
------------------------ 至此完美解决 ------------------------
更多推荐
已为社区贡献3条内容
所有评论(0)