场景说明 比如有个服务器管理页面。要显示服务器信息,并且包含其拥有的账号信息。展示示例如下: 表结构信息如下: t_server t_server_user 查询sql select ts.id, ts.host, tsu.id as user_id, tsu.user_name , tsu.server_id , tsu.port from t_server ts left join t_server_user tsu on ts.id = tsu.server_id 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 查询结果 问题点 我们在代码中定义的ResultMap <resultMap id="QueryServerResultMap" type="com.yyoo.deployer.beans.ServerBean" extends="com.yyoo.deployer.mapper.ServerMapper.BaseResultMap"> <collection property="userList" ofType="com.yyoo.deployer.entity.ServerUserBean"> <id column="user_id" property="id"/> <result column="user_name" property="userName" /> <result column="pass" property="pass" /> <result column="port" property="port" /> <result column="server_id" property="serverId"/> </collection> </resultMap> 1. 2. 3. 4. 5. 6. 7. 8. 9. 此处我们使用了collection标签。Mybatis会自动把上面的查询结果进行归类,形成一个server对象对应多个serverUser对象的形式。 这样做,不分页的时候是没有问题的。关键是分页的时候。 Mybatis在分页的时候生成的sql如下(下面均为查询第一页每页10条数据) select ts.id, ts.host, tsu.id as user_id, tsu.user_name , tsu.server_id , tsu.port from t_server ts left join t_server_user tsu on ts.id = tsu.server_id limit 10 offset 0 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 此语句的查询结果为:(为了方便区分,结果为红框部分) 按照我们的规则,最终形成的ServerBean其实只有6条。 解决办法 1. 在 collection 标签上使用子查询 该办法会有n+1查询的问题,此处我们就不做详细讲解了。 2. 重新计算分页的limit参数 该办法计算起来有点难度,我们也不做讲解 3. 自定义分页查询sql 其实造成这个问题的关键在于,sql查询返回的条数,和Mybatis最终组装后的结果bean的条数不一致。要一致的关键在于,我们的查询主体是Server,我们将sql改造为如下方式 select ts.id, ts.host, tsu.id as user_id, tsu.user_name , tsu.server_id , tsu.port from (select * from t_server limit 10 offset 0 ) ts left join t_server_user tsu on ts.id = tsu.server_id 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 直接将分页参数编写好,查询第一页的10条server信息。 注:采用此方式,我们就不能使用Mybatis的分页机制了,参数不能使用Mybatis-plus的Page对象,需要自定义分页信息,采用list返回,而且还得自定义 count 的查询语句。配套的 count查询语句如下 select count(id) from t_server ts 1. 2. 我们的分页和前端显示都是针对server,所以此处的count查询也只针对server。 ----------------------------------- ©著作权归作者所有:来自51CTO博客作者wx6375958b5f6b5的原创作品,请联系作者获取转载授权,否则将追究法律责任 Mybatis plus 一对多关联查询分页不准确的问题 https://blog.51cto.com/forlinkext/9023801
Mybatis plus 一对多关联查询分页不准确的问题
来源:这里教程网
时间:2026-03-01 17:35:43
作者:
编辑推荐:
- Mybatis plus 一对多关联查询分页不准确的问题03-01
- 深入理解Spring框架的自动装配原理03-01
- 从源码分析 MySQL 身份验证插件的实现细节03-01
- mgr参数-group_replication_auto_increment_increment03-01
- MySQL 8.x ,查询performance_schema.data_locks造成整个实例 hang了?03-01
- MySQL慢查询优化、索引优化、以及表等优化总结03-01
- MySQL 怼了架构师关于 optimize table 需求 与 为什么反对 optimize table03-01
- 中国电信天翼云位列云数据库领导者象限!03-01
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 从源码分析 MySQL 身份验证插件的实现细节
从源码分析 MySQL 身份验证插件的实现细节
26-03-01 - mgr参数-group_replication_auto_increment_increment
- MySQL 8.x ,查询performance_schema.data_locks造成整个实例 hang了?
- MySQL慢查询优化、索引优化、以及表等优化总结
MySQL慢查询优化、索引优化、以及表等优化总结
26-03-01 - MySQL 怼了架构师关于 optimize table 需求 与 为什么反对 optimize table
- 中国电信天翼云位列云数据库领导者象限!
中国电信天翼云位列云数据库领导者象限!
26-03-01 - 2023 Gartner® 云数据库管理系统魔力象限发布 PingCAP 入选“荣誉提及”
- PingCAP 受邀参加 FICC 2023,获 Open100 世纪全球开源贡献奖
- PingCAP上榜工信微报年度回顾三大具有国际影响力的开源社区之一
PingCAP上榜工信微报年度回顾三大具有国际影响力的开源社区之一
26-03-01 - 神州数码集团荣获 “TiDB 社 区 最 佳 贡 献 企 业”
神州数码集团荣获 “TiDB 社 区 最 佳 贡 献 企 业”
26-03-01
