该方案基于下面的场景而实现:
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
list = getDataA(request); - //获取数据源B的数据
- getDataB(request, list, response);
- return response;
- }
-
-
- private void getDataB(request request, List
list, response response) { - //数据源A的总条数
- Integer totalIts = list.size();
- //判断数据源A的全量数据是否超过当前分页条件所需条数
- //计算该页最后一条数据的位置
- Integer endNumber = request.getPageSize() * request.getPageNumber();
- //获取当前页数据源A的数据
- List
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
result=getDataB(); - subList.addAll(result.getList);
- response.setTotal(totalIts + result.getTotal());
- response.setList(subList);
- }
-
- /**
- * 内存分页
- *
- * @param responseDTO
- * @param list
- */
- private void pageCache(response responseDTO, List
list) { - if (CollectionUtils.isEmpty(list)) {
- responseDTO.setList(list);
- responseDTO.setTotal(list.size());
- return;
- }
- List
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}