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

Mybatis分页查询当前页数据条数大于实际返回的数据条数

1.神奇Bug描述

使用Mybatis进行分页查询时,使用到了如下sql:

select DISTINCT id,name,engineering_role  from role;

数据库查询出来一共9条数据,使用MybatisPlus进行查询时,
Page对象返回的记录条数也是9条,但是Record字段却只有8条数据。
Debug过程中发现返回的VO对象里面多了一个SQL语句没有的字段engineeringRoleList,但是engineeringRoleList字段确是有值的。

2.还原案发现场

多的engineeringRoleList是因为使用了自定义的resultMap映射,动态进行了字段添加,案例如下:

   <resultMap id="PersonResultMap" type="PersonVo"><id property="id" column="id"/><result property="name" column="name"/><collection property="engineeringRoleList" ofType="string"><result column="engineering_role"/></collection></resultMap>

上述SQL语句查询结果,刚好有2条数据除了engineering_role 的值不同,其他字段的值是相同的。

3.DK大师分析

这个问题是由于MyBatis的标签在分页查询时导致的数据折叠现象‌。
当使用进行一对多映射时,数据库返回的多条关联记录会被合并到主对象的集合属性中,导致实际返回的记录数少于分页查询的总数‌。

主要原因包括

1.分页插件(如PageHelper)基于SQL结果条数拦截,但会将相同主表记录合并‌
2.联表查询时,子表的多条记录会使主表数据重复,经折叠后数量减少‌

解决方案建议

改用嵌套select查询方式(注意N+1问题)‌

<collection property="engineeringRoleList" ofType="string" select="selectRoles" column="id"/>

业务层二次处理:先获取分页的主表数据,再批量查询关联数据‌

使用子查询避免联表:

SELECT r.id, r.name, (SELECT GROUP_CONCAT(engineering_role) FROM role WHERE id = r.id) AS engineeringRoleList
FROM role r

如果不需要分页,可移除改为单独查询‌
对于当前案例,建议检查是否有重复的id值导致合并,或考虑使用DISTINCT配合GROUP_CONCAT函数重构SQL‌。

http://www.dtcms.com/a/307003.html

相关文章:

  • 拥抱智慧物流时代:数字孪生技术的应用与前景
  • Matplotlib(四)- 图表样式美化
  • Linux日志管理和时钟同步配置指南
  • OneCode3.0 框架深入研究与应用扩展
  • html页面跳转或者a标签锚点跳转,解决页面滚动问题3个(1.从底部开始滚动,2.滚动不到指定锚点位置,3.页面展示不在最上面)
  • MySQL图解索引篇(2)
  • 斯皮尔曼spearman相关系数
  • 25年新算法!基于猛禽的优化算法(BPBO):一种元启发式优化算法,附完整免费MATLAB代码
  • Java反射-动态代理
  • cmake_parse_arguments()构建清晰灵活的 CMake 函数接口
  • 智汇AI,应用领航 | 华宇万象问数入选2025全景赋能典型案例
  • 36、spark-measure 源码修改用于数据质量监控
  • Linux零基础Shell教学全集(可用于日常查询语句,目录清晰,内容详细)(自学尚硅谷B站shell课程后的万字学习笔记,附课程链接)
  • 「Spring Boot + MyBatis-Plus + MySQL 一主两从」读写分离实战教程
  • Linux 中,命令查看系统版本和内核信息
  • Linux 系统原理深度剖析与技术实践:从内核架构到前沿应用
  • 【选型】HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议(ST 原厂 vs 国产芯片)(单片机选型主要考虑的参数与因素)
  • 【python】列表“*”方式与推导式方式初始化区别
  • 数据结构——单链表1
  • 【WRF-Chem】EDGAR 排放数据处理:分部门合并转化为二进制(Python全代码)
  • RAG实战指南 Day 27:端到端评估框架实现
  • CSS-in-JS 动态主题切换与首屏渲染优化
  • 1.5.Vue v-for 和 指令修饰符
  • COZE 开源,新一代 AI Agent 本地部署一条龙
  • Excel文件解析
  • OpenWrt Network configuration
  • 百度统计在哪里添加网站?
  • Linux系统启动不受未挂载硬盘影响的解决方案
  • Windows系统使用命令生成文件夹下项目目录树(文件结构树)的两种高效方法
  • 深度学习-丢弃法 Dropout