場景
在使用PageHelper的過程中,出現了一個很奇怪的問題,假設在數據庫中存放有30條Country記錄,我們用下面的方法使用PageHelper進行分頁查詢,那么我們希望得到的page.size是10。
PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectAll(); PageInfo page = new PageInfo(list); assertEquals(10, list.size());
一般情況下結果是如我們所願的,但是當下面的代碼放到SpringBoot中標明@PostConstruct的方法下后,查詢結果就是30而不是10,讓我們一起來看看其中的原因。
@Component
public class PageHelperProblem {
@Autowired
CountryMapper countryMapper;
@PostConstruct
public void init() {
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
PageInfo page = new PageInfo(list);
assertEquals(10, list.size());
}
}
原因
debug之后發現,在執行完代碼PageHelper.startPage(1, 10)之后,我們把pageSize和pageNum設置到ThreadLocal中去了,但是在執行下一行代碼之前,理論上應該進入到PageInterceptor攔截器中給sql動態的加上limit條件。但是沒有進去,原因在於Bean的PostConstruct執行的時候,Pagehelper的autoconfigure還沒有初始化,故而攔截器還沒有創建出來,所以導致的結果就是startPage只是把分頁參數設置到了ThreadLocal中去了,但是卻沒有被攔截器攔截,所以導致了分頁失敗,沒有達到預期的分頁效果。
參考文章:
https://www.liangzl.com/get-article-detail-132917.html
https://github.com/pagehelper/pagehelper-spring-boot/issues/38
本篇文章如有幫助到您,請給「翎野君」點個贊,感謝您的支持。
