mybatis 、mybatis-plus in 大于1000 解决方法
以下方法都是我开发过程中遇到问题时,在网上收集过来后直接使用或作出调整。
1、mapper.xml
<if test="dto.idList != null and dto.idList.size() > 0">
and (t.id IN
<foreach collection="dto.idList" index="index" open="(" close=")" item="item" >
<if test="index !=0">
<choose>
<when test="index % 1000 == 999">) OR t.id IN (</when>
<otherwise>,</otherwise>
</choose>
</if>
#{item}
</foreach>
)
</if>
2、mybatis-plus
public class MybatisParameterUtils {
public static <T, F> void cutInParameter(boolean condition, QueryWrapper<T> wrapper, String column, List<F> coll) {
if (condition) {
cutInParameter(wrapper, column, coll);
}
}
public static <T, F> void cutInParameter(QueryWrapper<T> wrapper, String column, List<F> coll) {
List<List<F>> newList = splitList(coll, 900);
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 cutInParameter(boolean condition, LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) {
if (condition) {
cutInParameter(wrapper, column, coll);
}
}
public static <T, F> void cutInParameter(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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) {
List<List<F>> newList = splitList(coll, 900);
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;
}
}