PageHelper.startPage()使用問題與手動list分頁


PageHelper.startPage()使用問題:自動添加多余的limit,以及利用PageInfo和Page手動分頁

問題描述

在工作中使用PageHelper.startPage()方法來讓mybait為我們自動設置分頁的pageNum,pageSize,但是有時候會出現自動為我們添加到了不需要分頁的查詢sql中,導致以下問題:

  • 查詢報錯,提示如下信息,sql沒有問題,是自動添加了多余的LIMIT ?,並且只是偶然發生;

  • 查詢的結果一頁應顯示10條,實則顯示5條;

使用規范

針對以上出現的情況,主要原因是.startPage()使用不當,參考相關說明文檔后,建議使用方法為:Mapper接口方式的調用,但是必須緊跟.startPage()方法;

 PageHelper.startPage(1, 10);
 List<Country> list = countryMapper.selectIf(1);

問題原因

底層主要是通過將pageNum,pageSize放入ThreadLocal

  protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();

但是在執行完.startPage()后,沒有查詢數據庫操作,並且此次查詢請求響應結束,線程空閑時,又有新的別的查詢請求進來,此時線程復用,mybaits通過自身的攔截器,導致給新的查詢自動添加了limit?,?,從而報錯

解決方案

因為項目中是查詢多次分類的結果后,需要對list進行分頁,此種情況,結合PageInfo和Page進行手動分頁,通過以下方法實現

 
     /**
      * pagehelper 手動分頁
      * @param currentPage 當前頁
      * @param pageSize
      * @param list
      * @param <T>
      * @return
      */
     public static <T> PageInfo<T> getPageInfo(int currentPage, int pageSize, List<T> list) {
         int total = list.size();
         if (total > pageSize) {
             int toIndex = pageSize * currentPage;
             if (toIndex > total) {
                 toIndex = total;
            }
             list = list.subList(pageSize * (currentPage - 1), toIndex);
        }
         Page<T> page = new Page<>(currentPage, pageSize);
         page.addAll(list);
         page.setPages((total + pageSize - 1) / pageSize);
         page.setTotal(total);
 
         PageInfo<T> pageInfo = new PageInfo<>(page);
         return pageInfo;
    }

 


免責聲明!

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



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