使用 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 相关文章推荐
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server携程核心系统无感迁移到MySQL实战
Jun 01 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
综合图片计数器
2006/10/09 PHP
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
php合并js请求的例子
2013/11/01 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
js substr、substring和slice使用说明小记
2011/09/15 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
python模块restful使用方法实例
2013/12/10 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
python常用数据重复项处理方法
2019/11/22 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
英国在线泳装店:Simply Swim
2019/05/05 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
旷课检讨书3000字
2014/02/04 职场文书
益达广告词
2014/03/14 职场文书
授权委托书怎么写
2014/04/03 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
道路施工安全责任书
2014/07/24 职场文书
地理科学专业自荐信
2014/09/01 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
思想政治表现评语
2015/01/04 职场文书
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js