关于分页,order by的问题

我在使用JFinal自带的paginate进行分页的时候,如果不带order by 字句,什么都很正常,如果带了order by就会发生一些数据丢失。

具体表现就是一共25条数据,每页最大显示20条,他会按两页显示,条数也对,但两页中会有重复数据,同时就有一些数据没有显示出来。

我是想根据查询出来的某一字段进行排序,这一字段是计算出来并不是表中本身就有的字段。

使用paginateByFullSql这个方法也同样没有解决问题。不知是我哪里设置的不对了,还望指点一下!谢谢!


评论区

JFinal

2017-09-14 09:57

分页查询中如果使用 order by 只要是没有报异常,结果一定是正确的,当然这个结果取决于你的 sql 是否正确

paginateByFulSql 本质上只是用于复杂 order by 的情况,例如下面这种情况:
select * from xxx where ... order by ( select yy from ...) as temp

由于分页查询需要用 select count(*) from (原 sql) as temp 去计算总记录条数,而 count(...) 函数不能与 order by 同时存在,所以需要针对 select count(*) 这个查询去掉 order by 子句

问题在于 order by 可以是无限复杂的嵌套 sql,以至于要用正则彻底覆盖所有 order by 所有模式的情况会让程序性能下降一至两个数量级

因此,为了权衡性能与便利性,paginate 方法中的正则仅匹配移除最常用的 order by 模式,而 paginateByFullSql 专门针对无法彻底移除 order by 的情况而生

yzdoraemon

2017-09-14 10:17

@JFinal 感想詹总回答。我想会不会是我的查询条件的问题,在进入页面时,是不带查询条件进行查询的,如果用户输入了查询条件,那我希望在点击下一页的时候能够显示带查询条件的下一页,我的方法就是在下一页这个链接上把所有的查询条件都以参数形式带了过去,同时把pageNum也带过去,在controller写了另一个专用于分页的查询方法,调用的也是service里面的这个SQL。

JFinal

2017-09-14 10:22

@yzdoraemon 建议单步调试一下,看看现场

热门反馈

扫码入社