Java:分批查询

在这里插入图片描述

前言

  • 最近遇到一个场景问题,就是基于SQL server数据库的规范,查询条件in如果个数超过2100个就会报错。由于是ORM映射框架采用的MybatisPlus 起初我想到的是基于 MybatisPlus 的 参数分割,测试还是不行,于是就直接基于 mybatis xml 去做这个事情了。
  • 思路:1-分批查询再汇总,2-再手动算法分页

伪代码举例

  • 改改就可以用了,只提供一个思路,可举一反三
//最大限制数量:根据自己场景设定
public static final int MATERIAL_LINE_EXCEL_MAX_NUM = 1500;
//分批数量:下面案例中由于我想要的数量就是1500,所以我就没有重写一个了
public static final int BATCH_SIZE = 500;


//将入参idList 进行分批查询
private List<OrderInfo> getOrderInfoList(reqParam param, List<Long> idList) {
        //总集合数
        List<OrderInfo> sumList = new ArrayList<>();
        if (idList.size() <= MATERIAL_LINE_EXCEL_MAX_NUM) {
            sumList  = orderInfoMapper.selectOrderInfoList(param, idList);
        } else {
            int i = idList.size() / IMPORT_LINE_EXCEL_MAX_NUM;
            for (int i1 = 0; i1 <= i; i1++) {
                if (i1 == i) {
                    //最后数据直接查询
                    List<Long> subList = idList.subList(i * IMPORT_LINE_EXCEL_MAX_NUM, idList.size());
                    if (CollectionUtil.isNotEmpty(subList)) {
                        List<OrderInfo> orderInfoList= materialRequisitionMapper.selectOrderInfoList(param, subList);
                        sumList.addAll(orderInfoList);
                    }
                } else {
                    //分批查询数据
                    List<Long> subList = idList.subList(i1 * IMPORT_LINE_EXCEL_MAX_NUM, (i1 + 1) * IMPORT_LINE_EXCEL_MAX_NUM);
                    List<OrderInfo>   orderInfoList= orderInfoMapper.selectOrderInfoList(param, subList);
                    sumList.addAll(materialRequisitionList);
                }
            }
        }
        return sumList;
    }


		Page<OrderInfo> page = new Page<>(param.getCurrent(), param.getSize());
 		//计算分页
        long startIndex = (param.getCurrent() - 1) * param.getSize();
        long endIndex = Math.min(startIndex + param.getSize(), orderInfoList.size());
        //截取
        List<OrderInfo> paginatedList = orderInfoList.subList((int) startIndex, (int) endIndex);
        //创建时间倒序
        paginatedList.sort(Comparator.comparing(OrderInfo::getOrderId).reversed());
        page.setRecords(paginatedList);
        page.setTotal(materialRequisitionList.size());
        return paginatedList; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值