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 實現類代碼:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM