开发者社区> 问答> 正文

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

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

调用分页方法时因为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 老大求解决!




展开
收起
爱吃鱼的程序员 2020-06-03 11:42:14 1090 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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


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

    ######我的还是不行,求大神说的详细点。######感谢,期待2.3!!######

    仔细分析下这个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.2就行了,2.2又取消了这种方式,代码得改一改。现在用jfinal已经没有了当初让人眼前一亮的感觉了,反而暴露的问题也越来越多了。######回复 @kerneler : bettl光看<%%>这种写法就没兴趣使用了,就算性能在高也不会用######我现在用的就是2.2######非主流技术就是靠着一个热点 或者入门快的优点拉人入坑。 比如beetl,之所以快 是因为它功能不完善,等后面功能完善了 也慢下来了,不过还是拿之前的效率在说事,各种对freemarker不屑,其实还是在模仿人家。
    2020-06-03 11:42:31
    赞同 展开评论 打赏
问答分类:
SQL
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载