Sql server中mybatis分页提示Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 'ROWNUMBER' 不是可以识别的 内置函数名称
//错误提示示例
### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 'ROWNUMBER' 不是可以识别的 内置函数名称。
### The error may exist in org/loushang/train/user/dao/UserDao.xml
### The error may involve org.loushang.train.user.dao.UserDao.query-Inline
### The error occurred while setting parameters
### SQL: SELECT * FROM ( SELECT B.*, ROWNUMBER() OVER() AS RN FROM ( select * from USER2 ) AS B ) AS A WHERE A.RN BETWEEN 1 AND 3
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 'ROWNUMBER' 不是可以识别的 内置函数名称。
///
原因分析:
这是因为分页时,没有指定排序依据,而(猜测)mybatis内置的sql拼接查询字符串也没有指定默认排序字段(这算是mybatis的一个bug吧),所以出现语法错误:
函数“row_number”必须有包含 ORDER BY 的 OVER 子句。
ROW_NUMBER() OVER( ) //错误:OVER子句不能为空。
ROW_NUMBER() OVER(order by user_id) //正确
另外一个错误:
mybatis中生成的分页语句是使用:ROWNUMBER() OVER() 这样的关键字,而sqlserver的内置函数是ROW_NUMBER(),而不是ROWNUMBER() 。
//以上测试基于:
Mybatis-3.2.1.jar
SqlServer2012
Eclipse JEE(LUNA)
Sqljdbc4.jar(也测试了Sqljdbc41.jar)
测试结果:
1.Mybatis+Sqlserver搭配:普通SELECT语句正常,使用分页时出错。
2.Mybatis+Oracle搭配:普通SELECT语句和分页语句都正常。
解决方法分析:
1.分页时手动指定排序字段。
2.Mybatis内置sqlserver分页时,对于未指定排序依据的,使用一种策略(比如按照第一个select的字段作为排序依据)指定分页依据。