JFinal分页查询中order by语句处理出错

发布于 2021-12-01 15:59:52 字数 547 浏览 825 评论 8

调用分页方法时因为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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

甜扑 2021-12-03 15:11:18

非主流技术就是靠着一个热点 或者入门快的优点拉人入坑。 比如beetl,之所以快 是因为它功能不完善,等后面功能完善了 也慢下来了,不过还是拿之前的效率在说事,各种对freemarker不屑,其实还是在模仿人家。

海之角 2021-12-03 14:36:18

我现在用的就是2.2

反目相谮 2021-12-03 13:01:38

回复
bettl光看<%%>这种写法就没兴趣使用了,就算性能在高也不会用

囚你心 2021-12-03 11:26:39

用最新的2.2就行了,2.2又取消了这种方式,代码得改一改。现在用jfinal已经没有了当初让人眼前一亮的感觉了,反而暴露的问题也越来越多了。

岁吢 2021-12-02 22:41:23

仔细分析下这个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返回即可,不做任何处理

多彩岁月 2021-12-02 21:12:50

感谢,期待2.3!!

筱果果 2021-12-02 17:05:49

我的还是不行,求大神说的详细点。

秉烛思 2021-12-02 11:51:57

分页查询中查询记录总数时会将 order by 子句给删掉,因为查询总数不需要 order by,为的就是提升性能,但 sql 可以极其灵活,在 order by 中几乎可以写任何子查询,所以 jfinal 原有的正则无法正确识别

jfinal 2.3 已经彻底解决了该问题,目前建议是新建一个 class MyDialect extends MySqlDialect 覆盖掉父类中的 replaceOrderBy 方法,在方法中直接 return sql,然后 arp.setDialect(new MyDialect()) 即可打完收工

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文