91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatisplus分頁查詢不生效如何排查

發布時間:2023-03-15 14:15:54 來源:億速云 閱讀:146 作者:iii 欄目:開發技術

這篇文章主要介紹“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的真實值不正確。

當后臺前端頁面傳來的current0時,offset等于0

當后臺前端頁面傳來的current1時,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分頁查詢不生效如何排查”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邢台县| 吉水县| 通辽市| 祁阳县| 都安| 睢宁县| 恩平市| 双牌县| 红河县| 剑阁县| 大新县| 乐清市| 沭阳县| 阜新| 綦江县| 西峡县| 阜南县| 五台县| 凭祥市| 安徽省| 邛崃市| 新绛县| 都匀市| 天台县| 淮滨县| 高雄市| 扎鲁特旗| 图们市| 彭水| 宽城| 泰来县| 嘉定区| 济阳县| 新蔡县| 中山市| 乌兰县| 重庆市| 永丰县| 滦南县| 汽车| 长治市|