问题描述
分页返回的记录总数 total 和每页数量 pageSize 一致,数据库统计的数量大于当前返回的总记录数 total,以下是相关代码

问题分析
sql 错误导致返回信息有误?
检查结果:经过数据执行日志中生成的 sql,sql 正常并且数据总条数也正确

PageHelper 使用方式错误,导致数据错误
检查结果:通过与项目中其他地方使用记录的对比,使用方式正确

返回结果后有中间处理导致总数减少
检查结果:网上有人遇到 对返回结果有类型转化导致 total 错误的情况, 以此类推,发现当前代码虽没有对返回结果进行类型转换但是对 mapper 返回的结果更换了实例对象然后将更换后的对象包装,

进一步查看包装成 PageInfo时源码并没有关于 total 参数的处理,

PageInfo构造方法

public class PageInfo extends PageSerializable {
/**

PageSerializable 构造方法

public PageSerializable(List list) {
this.list = list;
if(list instanceof Page){
this.total = ((Page) list).getTotal();
} else {
this.total = list.size();
}
}
进一步 debug,发现返回 list 确实不是 Page 类的实例,故推断出这一结果是由于对 mapper 返回 list 结果更换了实例对象导致的,

再次确认 mapper 返回结果,是 Page 的实例

解决方案
使用 mapper 返回的对象直接构造 PageInfo 对象,并在此基础上获取分页信息

更正的代码如下:

最佳实践
在使用 PageInfo pageInfo = new PageInfo<>(T); 构造 PageInfo 时直接使用 mapper 返回对象,不要进行类型转换或转存等操作,以免丢失数据。


↙↙↙阅读原文可查看相关链接,并与作者交流