使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题


Posted in SQL Server onApril 22, 2022

问题

使用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 分页问题的文章就介绍到这了!


Tags in this post...

SQL Server 相关文章推荐
【HBU】数据库第四周 单表查询
Apr 05 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
SQL中的三种去重方法小结
Nov 01 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
Nov 20 SQL Server
SQL SERVER存储过程用法详解
Feb 24 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 SQL Server
使用MybatisPlus打印sql语句
Apr 22 #SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
SQL Server Agent 服务无法启动
Apr 20 #SQL Server
SQLServer权限之只开启创建表权限
如何使用SQL Server语句创建表
Apr 12 #SQL Server
MSSQL基本语法操作
Apr 11 #SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 #SQL Server
You might like
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
Bootstrap表单布局
2016/07/19 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
正隆泰信息技术有限公司上机题
2012/06/14 面试题
shell变量的作用空间是什么
2013/08/17 面试题
初一生物教学反思
2014/01/18 职场文书
公司联欢会策划方案
2014/05/19 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
食品质检员岗位职责
2015/04/08 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
python实现的web监控系统
2021/04/27 Python
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
python 安全地删除列表元素的方法
2022/03/16 Python
Java基础——Map集合
2022/04/01 Java/Android