# 問題描述 眾所周知,pagehelper使用時應該在dao查詢語句的前一句加上PageHelper.startPage,因為startpage是SQL攔截器,攔截它之後的第一個SQL,所以標題的問題由此引出…… # 原因 ### PageHelper.startPage使用後會將list隱性的給 ...
問題描述
眾所周知,pagehelper使用時應該在dao查詢語句的前一句加上PageHelper.startPage,因為startpage是SQL攔截器,攔截它之後的第一個SQL,所以標題的問題由此引出……
原因
PageHelper.startPage使用後會將list隱性的給轉換為page類型,如圖所示
萬一沒轉換成Page類型呢?比如在controller層使用該方法去處理Service層的list數據,或者不按照規範未在Mapper語句上一行使用該方法時...
這樣就導致了後面在使用pageInfo時的一些問題,比如getTotal時,發現startPage方法轉換過的list並不是Page類型,而是普通的list類型,所以在getTotal時相當於直接調用的list.Size()去獲取總數,源碼如下:
解決方案
1.第一種解決方案:使用PageHelper.startPage時返回的page類傳入PageInfo里,比如
Page page = PageHelper.startPage(頁碼,頁數);
List<T> list = mapper/service/***.get(T);//要分頁的list
PageInfo<T> pageInfo = new PageInfo<>(page)//傳入page而非list
return pageInfo.getTotal();//返回總條數
2.第二種解決方案:不要在非Mapper返回的list上做處理,startPage只有在mapper語句的上一行添加才能隱形的把list轉換為page類型,其他比如service層返回的list均不能轉換為page。