您的位置:首页 > 数据库

Sql server中mybatis分页提示 'ROWNUMBER' 不是可以识别的内置函数名称

2015-04-17 22:46 316 查看
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的字段作为排序依据)指定分页依据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: