有没办法让分页统计不自动去除order by?

我发现在分页中,其中的count部分sql是会自动去除order by的,这应该是为了优化速度,但是在一些复杂的sql里面会造成问题,比如我的是用于group by中的order by,如果去除后会造成数据错误,如图所示:

问题.png

有没办法禁止自动去除order by呢?

评论区

风满楼

2020-12-08 08:45

你可以用paginateByFullSql(...) 数据sql和count sql 都由你自己来指定。

JFinal

2020-12-08 09:44

mysql 确实可以不用去除 order by , 其它数据库的 select count 查询必须要去除,否则会出错

当前最简单的办法是,你通过继承 MysqlDialect 做一个自己的 MyDialect,然后覆盖掉父类的几个 paginate 方法,去除 order by 的替换:
public class MyDialect extends MysqlDialect {
....
}

最后配置一下:
arp.setDialect(new MyDialect());

JFinal

2020-12-08 09:45

mysql 去除 order by 确实是为了性能,不过我在数据量不大的时候测试过,性能并无差别,可能是 mysql 内部已经做过这个优化

flash866

2020-12-08 09:58

flash866

2020-12-08 10:00

@JFinal 我看了一楼的方法挺好的,但是发现有2个sql但是只有一个参数用来绑定值(Db.paginateByFullSql),如何将参数分配给两个sql呢?

flash866

2020-12-08 10:01

@JFinal 代码如下:SqlPara countSQL = Db.getSqlPara("getNoBackSignInLogListCount",cond);
SqlPara findSql = Db.getSqlPara("getNoBackSignInLogList",cond);
Page page = Db.paginateByFullSql(getParaToInt("page",1),getParaToInt("limit",30),countSQL.getSql(),findSql.getSql());

flash866

2020-12-08 10:02

报错:com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: No value specified for parameter 1

风满楼

2020-12-08 10:12

@flash866 我猜你的sql里有 ? 但是却没给值。

flash866

2020-12-08 10:13

@风满楼 我在楼上已经贴出代码,赋值在 cond里面 cond代码如下:cond = Kv.by("datetime",datetime + " 00:00:00");

flash866

2020-12-08 10:20

@风满楼 @JFinal 多谢2位,问题我解决了,解决办法就是在分页中再次加上参数: Page page = Db.paginateByFullSql(getParaToInt("page",1),getParaToInt("limit",30),countSQL.getSql(),findSql.getSql(),datetime);

风满楼

2020-12-08 10:26

@flash866 不不不 还是那个问题 你有占位符却没给值 你的cond没有生效因为你的sql模板没有执行 你只是getSql 你传入的cond 并没有给你的?赋值 所以你后来再次赋值datetime才算是 setString.

flash866

2020-12-08 11:37

@风满楼 原来如此,多谢啦!

hzh740053757

2020-12-08 13:33

看下我发的分享@flash866

flash866

2020-12-08 14:28