sql语句里面使用row_number()over()方法的话,db的分页方法会抛异常

看源码是替换了所有的order by,row_number()直接就跪了

评论区

JFinal

2016-09-18 15:43

将 order by 替换为空串,只是为了查询总记录数 totalRow 时性能更好点,因为 select count(*) 去掉 order by 对最终结果是没有影响的

jfinal 2.3 会将这个优化去掉,一是因为不同数据库,不同的 order by 用法很灵活,正则表达式去除order by 子句并不可靠,二是因为在对 mysql 的 select count(*) ... order by ... 测试时表明,是否去除 order by 对性能几乎没有影响,数据库应该是对此自行做了优化

JFinal

2016-09-18 15:48

针对楼主的碰到的问题,通过如下几步解决:
1:建议自建一个publci class MyDialect extends MySqlDialect
2:覆盖掉其中的 replaceOrderBy(String sql) 方法,直接一句 return sql即可
3:arp.setDialect(new MyDialect());
注意,如果是Oracle则是继承OracleDialect,jfinal 2.3 不会再有此问题

lunarmans

2016-09-19 11:33

@JFinal 感谢!按照波总这样改了,2.3可以直接替换2.2吗,我正在全公司推广

JFinal

2016-09-19 11:35

@lunarmans 后续版本都会考虑升级问题,2.2 升到 2.3 很平滑,大部分功能都是添加,不影响原来的版本,感谢支持 jfinal 发展,多多关注社区动态

JFinal

2016-09-19 11:36

@lunarmans 按照我前面介绍的方法,用起来很顺爽吧,jfinal 是很容易扩展的,大部分组件在设计时都考虑了扩展性

lunarmans

2016-09-20 16:50

发现还是得替换order by,不然下面这种情况的sql会报错。
select count(*) from (select a,row_number() over(order by b) c from table) order by a
临时改成字符串trim完,在正则上加个(?=$)

JFinal

2016-09-20 17:05

@lunarmans 这个不是 paginate 自动生成的 sql 吧? 是你自己的 sql ,写对它就好

lunarmans

2016-09-21 09:58

@JFinal DbPro类里面的doPaginate方法,会拼接"select count(*)"和参数sqlExceptSelect,sqlExceptSelect参数就是"from (select a,row_number() over(order by b) c from table) where c=1 order by a"

JFinal

2016-09-21 11:19

@lunarmans 确保拼接后是正确的 sql ,可以正常执行就可以了

xiaoshushu

2016-09-23 10:00

@JFinal 波总,jfina2.3出来了?

热门反馈

扫码入社