若依 02 若依分页问题排查

一、问题排查

项目使用了 若依的框架,前端反馈了一个问题,总记录条数只有 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计算有问题。

image

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笔数据,就不会再有数据返回了。

参考资料

1. 若依分页问题排查
2. 解决若依的分页失效问题
3. ruoyi中 mybatis 一对多以及pageHelper分页问题

posted @ 2026-10-25 15:47  超轶绝尘  阅读(8)  评论(0)    收藏  举报