pagehelper踩坑:不分页的情况及解决

一、问题背景

  Java 后端使用了 PageHelper 分页插件来进行分页查询,但是发现有个方法分页不生效,总是返回的是全部数据。

  后来查了相关文档找到了问题原因如下。

二、不分页的几种情况

1、版本过低的问题

  问题:pagehelper没有效果,一直不能分页问题

  解决方法:引用其他博主的博客的解决:http://blog.csdn.net/linxingliang/article/details/52566881

  这个版本太老了,我的肯定不是这个原因

2、业务顺序问题

  问题:PageHelper 有的时候有效果,有时候没有效果。我在项目中就遇到了这个问题,我用管理员角色的时候就可以正常分页,用其他角色的时候就不行。

三、问题具体原因

  PageHelper 里面的 PageHelper.startPage(1,10); 只对该语句以后的第一个查询语句得到的数据进行分页,就算你在 PageInfo pa = new PageInfo("", 对象); 语句里面的对象是写的最终得到的数据,该插件还是只会对第一个查询语句所查询出来的数据进行分页

  第一个查询语句是指什么呢?

  举个例子吧:比如你有一个查询数据的方法,写在了 PageHelper.startPage(1, 10); 下面。但是这个查询方法里面包含两个查询语句的话,该插件就只会对第一查询语句查询的数据进行分页,而不是对返回最终数据的查询与基础查询出来的数据进行分页。

  所以解决方法就是:改变一下自己的代码结构,让最终需要的数据所需要的查询语句放在 PageHelper.startPage(1, 10) 下面就行。

四、项目踩坑参考

1、问题思路:

  排查问题的时候看日志打印的 sql,发现猫腻:PageHelper 拼接的 limit ? 怎么是加在 这个角色判断的sql语句上,而不是下面的具体数据查询语句上。

  再看代码里是这样写的:所以我们可以知道了,管理员的判断无需执行 sql 查询,故分页正常;其他角色判断会执行一个角色判断的sql,所以 limit ? 就加在了这条“第一条语句”上,后面的第二条数据查询语句就没有加上 limit。

2、解决方案:

  改变一下自己的代码结构,让最终查询数据的查询语句放在 PageHelper.startPage(1, 10) 下面就行。

  我们就这样改咯,把 角色的判断前置即可

  顺便优化一下之前的 service 实现类代码:

posted @ 2021-10-19 22:54  古兰精  阅读(3982)  评论(0编辑  收藏  举报