• 两个数据源的分页实现


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

    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}

  • 相关阅读:
    Pandas数据处理分析系列4-数据如何清洗
    【QEMU中文文档】1.3 弃用功能
    Mybatis
    在 Vue 2 中使用 Axios 发起 POST 和 GET 请求
    YOLOv8改进主干DAMOYOLO结构:最新改进提出 CReToNeXt 结构,基于阿里达摩院出品的DAMOYOLO核心网络模型进行改进,打造高性能检测器
    质效提升 | QA不做业务需求测试,你怎么看?
    【Python】jupyter notebook(学习笔记)
    iOS开发-CoreNFC实现NFC标签Tag读取功能
    React之事件机制与事件绑定
    MySQL JDBC编程
  • 原文地址:https://blog.csdn.net/PTtaoge/article/details/128027158