JFinal分页查询中order by语句处理出错
调用分页方法时因为where 语句中有排序,导致取终得到的sql不正确
order by cast(ifnull(guOrderNo,'999') as SIGNED)
最终得到的sql语句是这样子的
select count(*) from t_group_unit t where del_flag='0' and gu_outtag <> '1' and gu_type='10' as SIGNED) asc
跟踪代码应该是这个地方的正则匹配有问题
@JFinal 老大求解决!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
非主流技术就是靠着一个热点 或者入门快的优点拉人入坑。 比如beetl,之所以快 是因为它功能不完善,等后面功能完善了 也慢下来了,不过还是拿之前的效率在说事,各种对freemarker不屑,其实还是在模仿人家。
我现在用的就是2.2
回复
bettl光看<%%>这种写法就没兴趣使用了,就算性能在高也不会用
用最新的2.2就行了,2.2又取消了这种方式,代码得改一改。现在用jfinal已经没有了当初让人眼前一亮的感觉了,反而暴露的问题也越来越多了。
仔细分析下这个sql是有问题的,jfinal这样做也事出有因,理论上来说select count(*)查询数量的sql后面就不应该带有order by语句,对sql语法要求比较严谨的数据库执行这种sql直接报错,比如PG,所以jfinal只是在通用方法上直接截取了此部分,避免select count(*)报错
所以说,jfinal这样做本身没问题,但是在每个数据库方言里面重写一下replaceOrderBy似乎更好,如果数据库对此类sql要求不严谨,可以执行,就不处理order by,这样就更友好了
解决方法:
1.改为子查询方式,select count(*) from (原来的sql) t,测试不可行,正则一样会去除order by,但是此类子查询sql里面带有order by几乎所有数据库都是支持的
2.如果你确定你运行的目标数据库支持此类sql执行,比如你用的mysql,就在MysqlDialect中重写replaceOrderBy方法,直接把传进来的sql返回即可,不做任何处理
感谢,期待2.3!!
我的还是不行,求大神说的详细点。
分页查询中查询记录总数时会将 order by 子句给删掉,因为查询总数不需要 order by,为的就是提升性能,但 sql 可以极其灵活,在 order by 中几乎可以写任何子查询,所以 jfinal 原有的正则无法正确识别
jfinal 2.3 已经彻底解决了该问题,目前建议是新建一个 class MyDialect extends MySqlDialect 覆盖掉父类中的 replaceOrderBy 方法,在方法中直接 return sql,然后 arp.setDialect(new MyDialect()) 即可打完收工