一、問題背景
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 實現類代碼: