您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
首页
博文
课程
大赛
工具
更多
用户中心
开发者社区
>
博文
>
得嘞,分页插件PageHelper返回记录总数total竟然出错了!
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
得嘞,分页插件PageHelper返回记录总数total竟然出错了!
浩子淘天下
2024-02-22
IP归属:北京
174浏览
#### 问题描述 分页返回的记录总数total和每页数量pageSize一致,数据库统计的数量大于当前返回的总记录数total,以下是相关代码 ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-02-19-10-48eaSvb6tu10DqSyh.png) #### 问题分析 1. sql错误导致返回信息有误? 检查结果:经过数据执行日志中生成的sql,sql正常并且数据总条数也正确 2. PageHelper使用方式错误,导致数据错误 检查结果:通过与项目中其他地方使用记录的对比,使用方式正确 3. 返回结果后有中间处理导致总数减少 检查结果:网上有人遇到 [对返回结果有类型转化导致total错误的情况](https://zhuanlan.zhihu.com/p/159199627), 以此类推,发现当前代码虽没有对返回结果进行类型转换但是对mapper返回的结果更换了实例对象然后将更换后的对象包装, ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-02-19-10-48yJEpJ37dpXzGLafn.png) 进一步查看包装成`PageInfo<T>`时源码并没有关于total参数的处理, **`PageInfo<T>`构造方法** ```java public class PageInfo<T> extends PageSerializable<T> { /** * 包装Page对象 * * @param list page结果 * @param navigatePages 页码数量 */ public PageInfo(List<T> list, int navigatePages) { super(list); if (list instanceof Page) { Page page = (Page) list; this.pageNum = page.getPageNum(); this.pageSize = page.getPageSize(); this.pages = page.getPages(); this.size = page.size(); //由于结果是>startRow的,所以实际的需要+1 if (this.size == 0) { this.startRow = 0; this.endRow = 0; } else { this.startRow = page.getStartRow() + 1; //计算实际的endRow(最后一页的时候特殊) this.endRow = this.startRow - 1 + this.size; } } else if (list instanceof Collection) { this.pageNum = 1; this.pageSize = list.size(); this.pages = this.pageSize > 0 ? 1 : 0; this.size = list.size(); this.startRow = 0; this.endRow = list.size() > 0 ? list.size() - 1 : 0; } if (list instanceof Collection) { this.navigatePages = navigatePages; //计算导航页 calcNavigatepageNums(); //计算前后页,第一页,最后一页 calcPage(); //判断页面边界 judgePageBoudary(); } } } ``` 继续查看父类PageSerializable<T>,发现有关于total参数的处理,即mapper返回的list不是Page的实例时total会被设置为返回list的size大小 **PageSerializable构造方法** ```java public PageSerializable(List<T> list) { this.list = list; if(list instanceof Page){ this.total = ((Page)list).getTotal(); } else { this.total = list.size(); } } ``` 进一步debug,发现返回list确实不是Page类的实例,故推断出这一结果是由于对mapper返回list结果更换了实例对象导致的, ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-02-19-10-49Xc13qdyjHLFKEOUv.png) 再次确认mapper返回结果,是Page的实例 ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-02-19-10-49IInzSSRWcnQf7Bp.png) #### 解决方案 使用mapper返回的对象直接构造PageInfo对象,并在此基础上获取分页信息 更正的代码如下: ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-02-19-10-50VeNJFOMfcsrZdEG.png) #### 最佳实践 在使用 `PageInfo<T> pageInfo = new PageInfo<>(T)`; **构造PageInfo时直接使用mapper 返回对象,不要进行类型转换或转存等操作**,以免丢失数据。
上一篇:数据中台应具备哪些功能?
下一篇:京东零售数据资产能力升级与实践
浩子淘天下
文章数
2
阅读量
158
作者其他文章
01
SpringBoot使用log4j不生效的问题
原因分析SpringBoot默认使用logback作为日志框架,如果改用log4j需要去除掉logback相关依赖,以及自带的log starter步骤排除logback依赖# 查找依赖logback的包mvn dependency:tree -Dincludes=ch.qos.logback:logback-classic排除log-starter# 查找依赖spring-boot-starte
01
得嘞,分页插件PageHelper返回记录总数total竟然出错了!
问题描述分页返回的记录总数total和每页数量pageSize一致,数据库统计的数量大于当前返回的总记录数total,以下是相关代码问题分析sql错误导致返回信息有误?检查结果:经过数据执行日志中生成的sql,sql正常并且数据总条数也正确PageHelper使用方式错误,导致数据错误检查结果:通过与项目中其他地方使用记录的对比,使用方式正确返回结果后有中间处理导致总数减少检查结果:网上有人遇到
浩子淘天下
文章数
2
阅读量
158
作者其他文章
01
SpringBoot使用log4j不生效的问题
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号