在使用 MyBatis-Plus 進行分頁查詢時,很多開發者會遇到一個常見的問題:當分頁查詢接口返回值定義為 Page<T>
時,執行查詢會拋出異常;而將返回值修改為 IPage<T>
時,分頁查詢卻能正常工作。本文將從 MyBatis-Plus 的分頁機制入手,詳細分析這一問題的根源,并提供相應的解決方案。
一、問題現象描述
在 MyBatis-Plus 中,我們通常會定義一個分頁查詢接口,如下:
Page<CommentsEntity> selectComments(IPage<CommentsEntity> page, @Param("args") CommentsPageArgs args);
當返回值為 Page<CommentsEntity>
時,執行分頁查詢會拋出如下異常:
Expected one result (or null) to be returned by selectOne(), but found: 10
但是,如果將返回值修改為 IPage<CommentsEntity>
,分頁查詢便能夠正常執行。例如:
IPage<CommentsEntity> selectComments(IPage<CommentsEntity> page, @Param("args") CommentsPageArgs args);
這種現象讓很多開發者感到困惑:Page<T>
不是繼承自 IPage<T>
嗎?為什么二者作為返回值時的表現卻截然不同?
二、MyBatis-Plus 分頁機制簡析
要解答這個問題,我們首先需要了解 MyBatis-Plus 的分頁機制。
-
分頁插件
MyBatis-Plus 通過分頁插件(如PaginationInterceptor
或MybatisPlusInterceptor
)來實現分頁功能。在執行分頁查詢時,插件會攔截 SQL,并根據分頁參數(如當前頁碼、每頁大小)動態生成帶LIMIT
的查詢語句。 -
分頁查詢的返