Oracle 分页排序错乱问题

JFinal的OracleDialect.java,使用的分页方法:


public String forPaginate(int pageNumber, int pageSize, String select, String sqlExceptSelect) {

         int start = (pageNumber - 1) * pageSize;

         int end = pageNumber * pageSize;

         StringBuilder ret = new StringBuilder();

         ret.append("select * from ( select row_.*, rownum rownum_ from (  ");

         ret.append(select).append(" ").append(sqlExceptSelect);

         ret.append(" ) row_ where rownum <= ").append(end).append(") table_alias");

         ret.append(" where table_alias.rownum_ > ").append(start);

         return ret.toString();

}


//转换出来就是如下的分页方法,但这样的分页方法如果是单表查询不会出错,如果是多表查询就会有排序错乱的问题。

SELECT *

  FROM (

    SELECT ROW_.*, ROWNUM ROWNUM_

          FROM (SELECT * FROM SYS_USER B ORDER BY B.ID) ROW_

         WHERE ROWNUM <= 20

    ) TABLE_ALIAS

 WHERE TABLE_ALIAS.ROWNUM_ > 10;


//有一篇博文是这样写的:

http://www.cnblogs.com/zhouxunyu/p/3919783.html


//我录了一个实际测试的视频,也反应jfinal的分页方法有排序错乱问题。

http://pan.baidu.com/s/1gfDbCbD


评论区

JFinal

2016-07-05 11:17

非常感谢你如此详细的回复,oracle 分页的代码采用了使用很普遍的处理方式,广泛采用的 hibernate 也采用的这种分页方式,从没想到过这里会出问题,已经在处理之中了,一经确认会进行改进。最后,对于分页有啥好的建议可以提出来

IT技术成就梦想

2016-07-05 21:29

感谢波总的回复,在你的回复中说hibernate 也采用这种分页方式,我就开始怀疑是否我的sql语句写的有问题,在使用MINUS的分页方法测试,排序错乱和重复的现象依然存在,于是我又重新百度搜索oracle的排序问题,终于找到了oracle排序错乱的原因,主要还是我写的sql语句没有满足oracle分页排序必须满足的2个条件:(1、sql语句中必须有排序条件;2、排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键)。相关博文在这里:http://database.51cto.com/art/201010/231533.htm
建议波总在验证我的问题后,能够将oracle分页排序必须满足的2个条件写到下一个版本的jfinal手册里,以免像我这样的oracle新手再次出现这样的问题。

JFinal

2016-07-06 10:32

@IT技术成就梦想 非常感谢你能继续帮助研究验证此问题,我会在jfinal 手册的 oracle 章节将你的研究结果写进去,再次感谢 ^_^

马小酱

2019-03-29 17:42

今天就遇到这个问题了,原来如此!