欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis-plus使用Page时报错:“OFFSET”附近有语法错误

程序员文章站 2022-03-01 17:00:50
...

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)不报错。

相关标签: java spring