当前位置: 首页 > news >正文

java真分页查询两个库的数据,合并成一个结果集分页查询

/*** 合并两个库的数据,真分页* @param pageNum 页码(从1开始)* @param pageSize 页大小* @param age 查询条件(示例)* @return 分页结果*/public IPage<UserDTO> mergeUserPage(Integer pageNum, Integer pageSize, Integer age) {// 1. 查询两个库的总条数(全局总条数)Long db1Total = userDb1Mapper.selectUserTotal(age);Long db2Total = userDb2Mapper.selectUserTotal(age);Long total = db1Total + db2Total;// 2. 计算全局分页参数(起始位置、结束位置)long start = (pageNum - 1) * pageSize; // 全局起始索引(从0开始)long end = start + pageSize;           // 全局结束索引(不包含)// 3. 分段查询两个库的数据(避免查询全量)List<UserDTO> db1List = new ArrayList<>();List<UserDTO> db2List = new ArrayList<>();// 3.1 处理db1:计算需要从db1查询的条数if (start < db1Total) {// db1的查询起始位置:若start < db1Total,从start开始;否则db1无数据long db1Start = Math.max(start, 0);// db1的查询条数:最多取 end - db1Start,且不超过db1剩余条数long db1Size = Math.min(end - db1Start, db1Total - db1Start);if (db1Size > 0) {// MyBatis-Plus分页:current=起始页(从1开始),size=条数Page<UserDTO> db1Page = new Page<>((db1Start / pageSize) + 1, db1Size);IPage<UserDTO> db1IPage = userDb1Mapper.selectUserPage(db1Page, age);db1List = db1IPage.getRecords();}}// 3.2 处理db2:计算需要从db2查询的条数if (start < (db1Total + db2Total)) {// db2的查询起始位置:若start < db1Total,从0开始;否则从 start - db1Total 开始long db2Start = Math.max(start - db1Total, 0);// db2的查询条数:最多取 end - (db1Total + db2Start),且不超过db2剩余条数long db2Size = Math.min(end - (db1Total + db2Start), db2Total - db2Start);if (db2Size > 0) {Page<UserDTO> db2Page = new Page<>((db2Start / pageSize) + 1, db2Size);IPage<UserDTO> db2IPage = userDb2Mapper.selectUserPage(db2Page, age);db2List = db2IPage.getRecords();}}// 4. 合并并排序(按创建时间降序,保证全局有序)List<UserDTO> mergeList = new ArrayList<>();mergeList.addAll(db1List);mergeList.addAll(db2List);// 按createTime排序(需保证两个库的时间格式一致)mergeList = mergeList.stream().sorted(Comparator.comparing(UserDTO::getCreateTime).reversed()).collect(Collectors.toList());// 5. 裁剪当前页数据(极端场景:合并后条数超过pageSize,需裁剪)List<UserDTO> currentPageList = mergeList.stream().skip(start).limit(pageSize).collect(Collectors.toList());// 6. 构建分页结果Page<UserDTO> resultPage = new Page<>();resultPage.setCurrent(pageNum);resultPage.setSize(pageSize);resultPage.setTotal(total);resultPage.setRecords(currentPageList);return resultPage;}
}

 

http://www.zskr.cn/news/64391.html

相关文章:

  • 2025年11月晶振厂家推荐:权威榜与选择指南
  • 2025年11月晶振厂家推荐榜单:主流厂商综合对比与选择指南
  • YXC扬兴科技联系方式:产品服务与技术支持相关指南
  • 选择性检索增强代码补全技术解析
  • W55MH32 网络继电器三模自由控制:小程序按键网页随选 - 实践
  • Azure DevOps Server 2022.2 补丁(Patch 7)
  • 2025年免费简历模板排行榜:媲美付费版的优质选择
  • 笔记本电脑外接显示器偶尔不亮
  • 小马算力助力”欧陆词典翻译引擎“
  • 软件测试:基础概念一
  • WebMvcConfig 和 WebSecurityConfig 详解 - 实践
  • OOP-实验4 - FF
  • xenomai3 pcie网卡偶发性的oops
  • 11月28日总结 - 作业----
  • TDengine IDMP “无问智推”:克服工业智能化“信息沉睡”难题的利器
  • P8868
  • RAG的17种方式搭建方式研究
  • 2025.11.28博客
  • P3825
  • 全球首个语音 AI 广告平台问世;Sam Altman 与 Jony Ive:合作新硬件将「如湖畔山间小屋般平静」丨日报
  • Docker 部署 vs 二进制部署 在运维中的选择原则。
  • 完整教程:C语言入门(十三):操作符详解(1)
  • 2025 高低温试验箱十大实力厂家盘点 技术创新驱动行业应用
  • 振动台厂家哪家好?行业技术实力与应用领域探索
  • 2025高清免费图片素材网站推荐:十大优质平台,版权无忧
  • rust借用检查器
  • 字符编码和文件操作
  • 2025 全球温度循环试验箱厂家推荐!细分场景定制方案与成本分析
  • 2025年下半年江苏智能煤流系统、煤矿智能化系统开发公司综合推荐指南
  • 2025长沙公务员面试培训机构排名,速看!,湖南长沙公务员面试技术引领与行业解决方案解析