用Db.paginate时,把SQL里的order by都去掉了,以致SQL异常

因为我SQL里有用到oracle的 row_number() 函数,整个SQL如下:

select *

  from (select t.*,

               row_number() OVER(PARTITION BY t.fd_write_dept ORDER BY t.fd_create_time desc) row_flag

          from finance_budget t

         where 0 = 0

         ) rs

 where rs.row_flag = 1

用row_number的目的是想查相同fd_write_dept的最新的数据,又想用分页,所以就用了Db.paginate,运行的时候,就报异常

java.sql.SQLException: ORA-30485: 在窗口说明中丢失 ORDER BY 表达式

看jfinal打印出来的SQL就是变成了如下

select count(*) from (select t.*,

               row_number() OVER(PARTITION BY t.fd_write_dept ) row_flag

          from finance_budget t

         where 0 = 0

 ) rs

 where rs.row_flag = 1

就是把order by 去掉了,怎么办呢这是,有些子查询里的order by 是对结果有影响的,不应该为了count,而把里面所有的order by 都去掉吧


评论区

doubuxingle

2020-09-17 12:08

https://jfinal.com/doc/5-6

小智zaki

2020-09-17 13:51

@doubuxingle 我知道还有paginateByFullSql 这些方法,但这些用的都是字符sql,而我是用SQL管理的,需要用sqlPara,如果要通过sqlPara获取出来的sql,#para() 这样的设值方式就没用了。

doubuxingle

2020-09-17 14:19

#para()改成?挂参

小智zaki

2020-09-17 14:55

@doubuxingle 是的,要换成用#() 的形式

doubuxingle

2020-09-17 14:59

我说的是"?"

小智zaki

2020-09-17 15:20

@doubuxingle 用“?”就没意思了,顺序和类型都要对上,越写越多零散要封装。我是在写通用方法,所以用SQL管理,然后调用通用方法执行查询。

倾真鱼

2020-09-17 15:50

自己实现一个MyOracleDialect继承自OracleDialect,覆盖掉replaceOrderBy方法,直接returnsql。
public class MyOracleDialect extends OracleDialect {

/**
* 不做SQL中Order By语句的处理
* @param sql parse sql
* @return sql
*/
public String replaceOrderBy(String sql) {
return sql;
}

}
然后在Config中使用即可:
// 配置Oracle方言
arp.setDialect(new MyOracleDialect());

这样做就就不会走替换SQL中的order by的方法,对性能有一点影响,就是做select count(*) ...的时候会带上order by。

JFinal

2020-09-20 17:08

有关分页碰到的所有问题在这里都有的:
https://jfinal.com/doc/5-6