分页时 order by

有一个在navicat可以执行的sql

SELECT * FROM user where sex = 1 ORDER BY user_id NOT IN(7,8,9),score DESC;

在用jfinal分页时控制台打印sql变成

SELECT count(*) FROM user  where sex = 1  NOT IN(7,8,9),score DESC;

然后执行出错

这是怎么回事?




评论区

JFinal

2017-10-12 00:14

你的 order by 子句比较复杂,所以需要使用 paginateByFullSql ,具体用法见 jfinal 手册

flyinkeke

2017-10-12 10:43

看来没事要多看看手册

JFinal

2017-10-13 10:31

@flyinkeke 分页功能需要有一个查询总页数的 sql 存在,例如 mysql 是这样:
select count(*) from ....

但是 count(*) 这种查询是与 order by 无关的,为了提升性能需要去掉 order by,mysql 以外的数据库干脆就会对 count(*) 带 order by 的 sql 直接报错,不允许

而要去掉这个 order by, 通常要用正则表达式。 但是 sql 语句可以是极其灵活和复杂的,例如你代码中的:
ORDER BY user_id NOT IN(7,8,9),score DESC;

用正则表达式确实可以覆盖并去掉你上面的 order by , 但代价是性能下降至少一个数量级

因此 jfinal 采用了如下权衡的方案:
1:对 order by 的移除,仅使用不影响性能的表达式,仅移除最常用的简单 order by 格式

2:对于不能移除的,使用 paginateByFullSql(...) 方法解决

设计就是权衡与选择,没有完美的设计

热门反馈

扫码入社