• 两个数据源的分页实现


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

    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的总条数

    伪代码:

    1. @Override
    2. public response getInitData(Request request) {
    3. response response = new response();
    4. response.setPageNumber(request.getPageNumber());
    5. response.setPageSize(request.getPageSize());
    6. //获取数据源A全量数据
    7. List list = getDataA(request);
    8. //获取数据源B的数据
    9. getDataB(request, list, response);
    10. return response;
    11. }
    12. private void getDataB(request request, List list, response response) {
    13. //数据源A的总条数
    14. Integer totalIts = list.size();
    15. //判断数据源A的全量数据是否超过当前分页条件所需条数
    16. //计算该页最后一条数据的位置
    17. Integer endNumber = request.getPageSize() * request.getPageNumber();
    18. //获取当前页数据源A的数据
    19. List subList = list.stream().skip((request.getPageNumber() - 1) * request.getPageSize())
    20. .limit(request.getPageSize()).collect(Collectors.toList());
    21. if (totalIts >= endNumber) {
    22. //需要加上数据源B的条数
    23. response.setTotal(totalIts + totalDataB);
    24. response.setList(subList);
    25. return;
    26. }
    27. Integer pageSize = request.getPageSize();
    28. //计算数据源B分页的偏移量
    29. Integer offset = totalIts % pageSize;
    30. //计算本次数据库分页起始位置
    31. Double pageNumber = Math.ceil((double) (endNumber - list.size()) / pageSize);
    32. //物理分页查询数据源B
    33. dataList result=getDataB();
    34. subList.addAll(result.getList);
    35. response.setTotal(totalIts + result.getTotal());
    36. response.setList(subList);
    37. }
    38. /**
    39. * 内存分页
    40. *
    41. * @param responseDTO
    42. * @param list
    43. */
    44. private void pageCache(response responseDTO, List list) {
    45. if (CollectionUtils.isEmpty(list)) {
    46. responseDTO.setList(list);
    47. responseDTO.setTotal(list.size());
    48. return;
    49. }
    50. List pageResult = list.stream().skip((responseDTO.getPageNumber() - 1) * responseDTO.getPageSize())
    51. .limit(responseDTO.getPageSize()).collect(Collectors.toList());
    52. responseDTO.setList(pageResult);
    53. responseDTO.setTotal(list.size());
    54. }

    oracle 物理分页语句

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

  • 相关阅读:
    RabbitMQ--基础--04--运转流程
    kibana 上dashbord 和discover 时间快 or 慢 8小时,处理方案
    rpm安装mysql5.7详细教程
    大数据分析实践 | 过滤和抽样
    Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法
    ajax上传文件
    NAACL2022:(代码实践)好的视觉引导促进更好的特征提取,多模态命名实体识别(附源代码下载)...
    cpp qt 一个奇怪的bug
    【Java基础】异常概述、try-catch、throws方式处理异常及自定义异常
    Dinky上路之旅
  • 原文地址:https://blog.csdn.net/PTtaoge/article/details/128027158