无限分页数据返回
- 一、问题排查
- 1.1 代码排查
- 1.2 sql排查
- 1.3 原因分析
- 二、问题修复
项目使用了 若依的框架,前端反馈了一个问题,总记录条数只有 48条的情况下,传入的 页数时从6~~无穷大
,每页大小为10, 此时还能返回数据,并且一直都有分页数据返回,在客户端下拉加载更多数据的情况下会一直可以加载数据。
一、问题排查
1.1 代码排查
实现分页查询的代码如下,从代码上看没有明显看出问题
@GetMapping("/list")
public TableDataInfo<CourseWareDto> list(CourseWareSearchReq courseWareSearchReq) {
startPage();
return getDataTable(coursewareService.selectKnowledgeBase(courseWareSearchReq));
}
/**
* 设置请求分页数据
*/
public static void startPage() {
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
Boolean reasonable = pageDomain.getReasonable();
PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
}
1.2 sql排查
从sql日志上看, 明显看出问题了,当前请求的页码是16,每一页大小是10,正常的sql分页应该是
limit 150, 10
,但是日志里面是limit 40, 10
,分页大小是没有问题,offset计算有问题。
1.3 原因分析
项目进入调试模式,接收到的页面也是16,但是为什么offset计算的时候变成了4,继续排查最终找到了可以代码Boolean reasonable = pageDomain.getReasonable();
进入查看源码,发现这里有一个分页参数合理化
的参数。
public class PageDomain {
...
/**
* 分页参数合理化
*/
private Boolean reasonable = true;
}
对接口进行多次调用[都超过了最大分页数],测试出了这个参数的作用是当你传入的页数超过最大可用页数时, 会自动为你(最大可用页数-1)来使分页参数合理化, 以此来保证你的分页查询一直有数据返回
,看来问题就是出现在这里,框架自动对分页进行了纠正。
二、问题修复
移除掉对reasonable
的使用,无分页数据是,返回空集合,不在纠正分页参数即可。
/**
* 设置请求分页数据
*/
public static void startPage() {
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.startPage(pageNum, pageSize, orderBy);
}
重新启动项目,再次查询第6页,每页10笔数据,就不会再有数据返回了。