zoukankan      html  css  js  c++  java
  • mybatis plus 解决in条件不能超过1000的java工具

    package xxx.utils;
    
    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;
        }
    }

    用法示例

      //                                   这是一个条件wrapper    get方法的方法引用       一个参数list   
    MybatisParameterUtils.cutInParameter(deleteInfoWrapper, Vo::getId, list);

    思路就是把条件拆成小于1000的组合条件  写xml同理

  • 相关阅读:
    spring 事务管理
    snmp4j 异步获取节点信息
    snmp4j 过滤错误的节点
    国际化支持
    通过Java反射机制获取对象的方法
    jdk中有哪些包不用自动导入
    位运算符
    spring 从入门到精通 (一)
    命令行工具nslookup查域名DNS服务器
    java/php DES/CBC/PKCS5Padding加密解密算法实现过程
  • 原文地址:https://www.cnblogs.com/funkboy/p/15792255.html
Copyright © 2011-2022 走看看