当前位置: 首页 > 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.jsqmd.com/news/54353/

相关文章:

  • 【Microsoft Learn】Microsoft Azure 服务 - 教程
  • U636458 蛇
  • 7款AI论文写作辅助必备工具:毕业论文高效完成全攻略
  • MySQL语法之用alter增加删除列
  • 【JUnit实战3_17】第九章:容器内测试(下)——Arquillian 框架的用法简介 - 实践
  • 详细介绍:Web安全深度实战:从漏洞挖掘到安全防护
  • 敬请人(自己)采/警示后人(自己)合辑
  • 利用多项式模型对二维平面上的数据点进行拟合时,需要预先指定多项式的次数吗?
  • 使用RecyclerView.ItemDecoration自定义RecyclerView圆角滚动条
  • SkeyeVSS视频融合系统——安全帽AI检测算法 - 教程
  • 技术分析:越南部分银行 App 不当使用 iOS 私有 API
  • U636457 刺客
  • Windows Docker 安装 RabbitMQ(包含客户端图形界面) - Higurashi
  • 《R语言医学数据分析实战》学习记录|第三章 数据框的操作
  • 软件工程学习日志2025.11.28
  • 2025年11月晶振厂家推荐:权威榜与选择指南
  • 2025年11月晶振厂家推荐榜单:主流厂商综合对比与选择指南
  • 漏洞赏金猎人的深度侦察方法论 | 第一部分
  • 2025年11月晶振厂家推荐:权威榜单与选择指南
  • 高效且常用的国产AI工具
  • 2025年11月晶振厂家推荐榜单:主流厂商综合对比选择指南
  • 2025年11月晶振厂家推荐榜单:知名品牌综合对比与选购指南
  • YXC扬兴科技联系方式:产品服务与技术支持相关指南
  • 13.2.3.Tomcat - 详解
  • 选择性检索增强代码补全技术解析
  • W55MH32 网络继电器三模自由控制:小程序按键网页随选 - 实践
  • Day49(19)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management
  • Azure DevOps Server 2022.2 补丁(Patch 7)
  • U636462 无根树
  • 人工智能:用Gemini3一分钟生成手势控制3D粒子交互系统