Mybatis-plus使用Page时报错:“OFFSET”附近有语法错误
程序员文章站
2022-03-01 17:00:50
...
Mybatis-plus使用分页工具Page时报错:“OFFSET”附近有语法错误
Mybatis-plus使用分页工具Page时报错:“OFFSET”附近有语法错误
最近在开发中遇到一个问题,在使用mybatis-plus的分页工具Page进行分页查找时报错。
代码实现
maven依赖:
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
service层:
@Override
public Page getList(Integer pageNo, Integer pageSize, String userName) {
Page page = new Page(pageNo, pageSize);
// 设置OrderItem, order by create_time desc
List<OrderItem> orderItems = new ArrayList<>();
orderItems.add(OrderItem.desc("create_time"));
page.addOrder(orderItems);
Page result = userMapper.getList(page, userName);
return result;
}
mapper层
@Mapper
public interface UserMapper {
//按条件查询分页数据
Page getList(Page page, String userName);
}
xml文件:
<select id="getList" resultType="com.demo.modules.task.entity.user">
SELECT
[id], [user_name], [user_fullname]
FROM user
WHERE user_name = #{userName}
</select>
报错
com.microsoft.sqlserver.jdbc.SQLServerException: “OFFSET”附近有语法错误。
解决过程
定位原因
找到报错时执行的sql语句:
SELECT
[id], [user_name], [user_fullname]
FROM user
WHERE user_name = ? OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
说明是OFFSET前面缺少了order by create_time desc
打断点在执行前看page对象,orderItem已经确认添加上去了
然后找到控制台报错前的一句WARN
WARN at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.concatOrderBy(PaginationInterceptor.java:142)- failed to concat orderBy from IPage, exception=null
进入com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.java,在concatOrderBy打上断点
在执行该句代码时异常:
Select selectStatement = (Select)CCJSqlParserUtil.parse(originalSql);
在控制台debug监视CCJSqlParserUtil.parse(originalSql),直接抛出异常,是sql语句的问题
解决方式
去掉sql中的中括号
xml文件:
<select id="getList" resultType="com.demo.modules.task.entity.user">
SELECT
id, user_name, user_fullname
FROM user
WHERE user_name = #{userName}
</select>
去掉后成功运行,CCJSqlParserUtil.parse(originalSql)不报错。
下一篇: '@P0'附近有语法错误