首頁 > 軟體

解決MybatisPlus SqlServer OFFSET 分頁問題

2022-04-21 19:01:18

問題

使用MybatisPlus 連線 SqlServer 資料庫 ,在分頁的時候發生瞭如下的報錯,sql語句和報錯如下:

Cause: com.microsoft.sqlserver.jdbc.SQLServerException: “@P0”附近有語法錯誤。
...
SQL: SELECT  * FROM tb_admin  OFFSET 0 ROWS FETCH NEXT 15 ROWS ONLY

錯誤原始碼重現

依賴

		<!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--        SqlServer依賴-->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
            <version>7.4.1.jre8</version>
        </dependency>

設定分頁

@Configuration
public class MybatisPlusConfig {
    /**
     *   mybatis-plus分頁外掛
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER));
        return interceptor;
    }
}

分頁處

//開始分頁
IPage<Admin> pageInfo = new Page<Admin>().setCurrent(current).setSize(size);
pageInfo = adminService.page(pageInfo, wrapper); //報錯點

找資料

OFFSET 0 ROWS FETCH NEXT 15 ROWS ONLY 是SqlServer2012之後才有的
關鍵字解析:

  • Offset子句:用於指定跳過(Skip)的資料行;
  • Fetch子句:該子句在Offset子句之後執行,表示在跳過(Sikp)指定數量的資料行之後,返回一定資料量的資料行;
  • 執行順序:Offset子句必須在Order By 子句之後執行,Fetch子句必須在Offset子句之後執行;

所以解決問題的關鍵是,加一個排序。

至於為什麼,我大致看了一下其他的解釋,說得加一個唯一欄位排序,否則系統排序結果不唯一?於是我隨便試了一下order by 非唯一欄位一樣分頁正常,這種說法說不通。
如果有懂的,歡迎評論區留言

解決

在page之前,新增orderby字句

//開始分頁
IPage<Admin> pageInfo = new Page<Admin>().setCurrent(current).setSize(size);
wrapper.orderByDesc("id");
pageInfo = adminService.page(pageInfo, wrapper); //報錯點

到此這篇關於MybatisPlus SqlServer OFFSET 分頁問題的文章就介紹到這了,更多相關MybatisPlus SqlServer分頁內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com