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 老大求解决!
分页查询中查询记录总数时会将 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返回即可,不做任何处理
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。