问题描述 分页返回的记录总数total和每页数量pageSize一致,数据库统计的数量大于当前返回的总记录数total,以下是相关代码
问题分析 sql错误导致返回信息有误? 检查结果:经过数据执行日志中生成的sql,sql正常并且数据总条数也正确
PageHelper使用方式错误,导致数据错误 检查结果:通过与项目中其他地方使用记录的对比,使用方式正确
返回结果后有中间处理导致总数减少 检查结果:网上有人遇到 对返回结果有类型转化导致total错误的情况, 以此类推,发现当前代码虽没有对返回结果进行类型转换但是对mapper返回的结果更换了实例对象然后将更换后的对象包装,
进一步查看包装成PageInfo
PageInfo
public class PageInfo
包装Page对象
@param list page结果
@param navigatePages 页码数量
/ public PageInfo(List
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,发现有关于total参数的处理,即mapper返回的list不是Page的实例时total会被设置为返回list的size大小
PageSerializable构造方法
public PageSerializable(List
再次确认mapper返回结果,是Page的实例
解决方案 使用mapper返回的对象直接构造PageInfo对象,并在此基础上获取分页信息
更正的代码如下:
最佳实践
在使用 PageInfo