3.0版本使用SQLServer数据库处理分页出错

我是由2.0升到3.0版本,使用SQLServer数据库处理分页时,底层由DbKit.class中的replaceFormatSqlOrderBy改用dialect.class中的replaceOrderBy,函数里面什么也没处理,SQLServer中的select count(*)语句不允许后面带order by语句,SqlServerDialect.class中也没有处理,要怎么解决?

评论区

JFinal

2017-02-09 11:32

具体出现了什么问题?

简单

2017-02-09 14:06

@JFinal Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: ORDER BY 子句中的列 "RDP_Resource.res_Create" 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

JFinal

2017-02-09 14:07

整个 sql 是什么样的? 目测是 sql 没写对

简单

2017-02-09 14:08

@JFinal select COUNT(*) from RDP_Resource order by res_Create desc
消息 8127,级别 16,状态 1,第 1 行
ORDER BY 子句中的列 "RDP_Resource.res_Create" 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
SQLServer中的错误提示

JFinal

2017-02-09 14:10

将 select COUNT(*) from RDP_Resource order by res_Create desc 这行 sql 在纯控制台执行一下看有没有错误,如果有错误改好以后再放入 java 代码中

简单

2017-02-09 14:12

@JFinal SQLServer中的Count()函数需要去掉Order by部分,原来DbKit.class中的replaceFormatSqlOrderBy是能够去掉的,现在没了,但是分页还需要加上排序

简单

2017-02-09 14:14

@JFinal 分页中是先计算个数,后取数据,我不能把两个SQL语句放到paginate函数里

JFinal

2017-02-09 14:16

尝试两个方案:
1:通过创建 MySqlServerDialect extends SqlServerDialect 并且覆盖掉 replaceFormatSqlOrderBy 方法,将老版本中的处理再用上

2:外层再套一个 select * from ( 原 sql) as temp,大致这样:
paginate(1, 10, "select *", "from (原来的整个 sql) as temp", ....)

JFinal

2017-02-09 14:17

以前的 replaceFormatSqlOrderBy 方法仍然保留了,只是改为了空实现,就是为了应对不确定的情况发生,这种不确定还真的就发生了

简单

2017-02-09 14:20

@JFinal 好吧,我试试看吧

JFinal

2017-02-09 14:22

@简单 注意一下方法名为:replaceOrderBy,可能你的 jfinal 版本更老,很老的版本才叫:replaceFormatSqlOrderBy

热门反馈

扫码入社