两个数据源的分页实现

该方案基于下面的场景而实现:

1.数据源A的体量很小(可以进行全量查询),另一个数据源B体量较大,必须物理分页

2.数据源A和数据源B不用做相同字段的排序,如数据源A的数据始终放在数据源B前面

实现方案:

1.先全量获取数据源A的数据

2.判断数据源A的数据是否满足当前页的数据量要求

3.如果满足,直接对数据源A的数据进行内存分页处理,返回结果(这里的总条数需要加上数据源B的总条数),否则进入第4步

4.获取当前页数据源A的数据

5.计算数据源B分页的偏移量

6.计算数据源B分页的(pageNumber)起始位置

7.物理分页查询数据源B

8,处理返回结果(数据源B的分页查询结果加上当前页数据源A的数据),总条数需要加上数据源A的总条数

伪代码:

 @Override
    public response getInitData(Request request) {
        response response = new response();
        response.setPageNumber(request.getPageNumber());
        response.setPageSize(request.getPageSize());
		//获取数据源A全量数据
        List<xx> list = getDataA(request);
		//获取数据源B的数据
        getDataB(request, list, response);
        return response;
    }

   
    private void getDataB(request request, List<xx> list, response response) {
		 //数据源A的总条数
        Integer totalIts = list.size();
		//判断数据源A的全量数据是否超过当前分页条件所需条数
        //计算该页最后一条数据的位置
        Integer endNumber = request.getPageSize() * request.getPageNumber();
          //获取当前页数据源A的数据
        List<xx> subList = list.stream().skip((request.getPageNumber() - 1) * request.getPageSize())
                .limit(request.getPageSize()).collect(Collectors.toList());

        if (totalIts >= endNumber) {
            //需要加上数据源B的条数
            response.setTotal(totalIts + totalDataB);
            response.setList(subList);
            return;
        }
      
        Integer pageSize = request.getPageSize();
        //计算数据源B分页的偏移量
        Integer offset = totalIts % pageSize;
        //计算本次数据库分页起始位置
        Double pageNumber = Math.ceil((double) (endNumber - list.size()) / pageSize);
        //物理分页查询数据源B
        dataList<xx> result=getDataB();
		subList.addAll(result.getList);
        response.setTotal(totalIts + result.getTotal());
        response.setList(subList);
    }

    /**
     * 内存分页
     *
     * @param responseDTO
     * @param list
     */
    private void pageCache(response responseDTO, List<xx> list) {
        if (CollectionUtils.isEmpty(list)) {
            responseDTO.setList(list);
            responseDTO.setTotal(list.size());
            return;
        }
        List<xx> pageResult = list.stream().skip((responseDTO.getPageNumber() - 1) * responseDTO.getPageSize())
                .limit(responseDTO.getPageSize()).collect(Collectors.toList());
        responseDTO.setList(pageResult);
        responseDTO.setTotal(list.size());
    }

oracle 物理分页语句

select *from t(select t.*,rownum rm from T t )where rn> (#{pageNumber}-1)*#{pageSize}-#{offset} and run<=#{pageNumber}*#{pageSize} -#{offset}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值