您好,登錄后才能下訂單哦!
這篇文章主要介紹“Mybatisplus分頁查詢不生效如何排查”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Mybatisplus分頁查詢不生效如何排查”文章能幫助大家解決問題。
在查詢的時候,發現點擊后臺的分頁器數字,第2頁時候,數據還是和第1頁的一致。就看后臺的數據庫打印語句,如下所示。點擊第一頁和第二頁都是這個,limit后的參數只有一個,前期做過類似,點擊第二頁分頁的時候,語句是LIMIT ?,?
ON ap.id = a.project_id ORDER BY a.create_time DESC LIMIT ?
1.首先開始懷疑的是自己的分頁對象出現了問題,因為MySQL ORM框架使用了JPA框架遺留的代碼。將spring-data
的分頁對象org.springframework.data.domain.Pageable
轉成了mybatis-plus
的分頁對象com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>
。
debug后,Page<T>
的 current 和 size 都是存在且對應前臺傳來的值。
2.接著懷疑是mybatis-plus
的攔截器順序問題,因為項目里寫了數據權限的攔截器,在研究數據權限攔截器的時候就看到有說攔截器添加順序會影響到SQL語句拼接的正確性。對比了正常的添加順序后,這部分也沒有問題。
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //添加數據權限處理器,注意順序,先數據權限再分頁 MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor(); // 添加自定義的數據權限處理器 dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler()); interceptor.addInnerInterceptor(dataPermissionInterceptor); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; }
3.發現這兩部分都沒問題后,決定還是debug一下分頁攔截器。
重要的分頁SQL語句拼接函數如下。
DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize());
進入到里面,這里數據庫使用的MySQL。
public class MySqlDialect implements IDialect { @Override public DialectModel buildPaginationSql(String originalSql, long offset, long limit) { StringBuilder sql = new StringBuilder(originalSql).append(" LIMIT ").append(FIRST_MARK); if (offset != 0L) { sql.append(StringPool.COMMA).append(SECOND_MARK); return new DialectModel(sql.toString(), offset, limit).setConsumerChain(); } else { return new DialectModel(sql.toString(), limit).setConsumer(true); } } }
可以看到偏移量offset
至關重要,決定了拼接的條件判斷。
又發現,offet的值和current相關,根據排查結果來看,current 是正常傳值的。
default long offset() { long current = this.getCurrent(); return current <= 1L ? 0L : Math.max((current - 1L) * this.getSize(), 0L); }
因此到這里我們就會發現,是offset
的真實值不正確。
當后臺前端頁面傳來的current
是0
時,offset
等于0
。
當后臺前端頁面傳來的current
是1
時,offset
依舊等于0
。
而回到拼接函數buildPaginationSql
中,不等于0的時候才會有 兩個參數的拼接。
至此,這個問題解決了,就是在對象轉換時,沒有對current
的值進行 + 1
public class MyPage<T> extends Page<T> { /** * @Description: 將spring的分頁對象轉成Mybatis * @param pageable: * @return: null **/ public MyPage(Pageable pageable) { this.setSize(pageable.getPageSize()); this.setCurrent(pageable.getPageNumber() + 1); } }
關于“Mybatisplus分頁查詢不生效如何排查”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。