该方案基于下面的场景而实现:
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}