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

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}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐