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 实现类代码:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2017-10-19 跨域请求如何设置cookie的问题
2017-10-19 浅析Promise.catch()错误捕获机制的理解及try catch错误捕获与往上冒泡的处理
2017-10-19 浅析ProgressEvent接口及其应用:上传文件进度事件
2017-10-19 集合转数组的toArray()和toArray(T[] a)方法
2017-10-19 重复输出一个给定的字符串