hibernate的分页排序BUG,有人会解决吗?

zhouyou96 2011-07-26 02:39:48
在用hibernate处理oracle分页并排序问题时候会存在一个问题:第一页的数据在第二页中也显示,而应该在第二页显示的数据没有显示。
请问一下,有没有遇到这种问题的?如何解决啊?原因我知道,但不知道怎么解决。
原因就是查询第一页时所生成的查询代码和第二页及之后页的查询代码不一样,怎么解决呢?

第一页时是:
select * from (myquery) where rownum<10
第二页及之后页时是:
select * from (select row_.*,rownum rownum_ from (myquery) row_) where rownum_<=20 and rownum_>10

以上myquery就是我自己传入的查询代码,里面是包含orderby的
...全文
492 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
polohoho1 2014-03-26
  • 打赏
  • 举报
回复
引用 18 楼 polohoho1 的回复:
是由于 第一页第二页不同的sql 造成数据库执行计划不一致,然后就出现楼主的情况了
http://blog.csdn.net/polohoho1/article/details/9283957
LinusLan 2013-10-25
  • 打赏
  • 举报
回复
加了个Id,看到楼主在其他地方发的帖子有人回了,说是排序的字段不够,所以加个id,加了id排序,唯一值排序就可以了。太感谢了。
polohoho1 2013-07-11
  • 打赏
  • 举报
回复
是由于 第一页第二页不同的sql 造成数据库执行计划不一致,然后就出现楼主的情况了
leoidg 2013-04-15
  • 打赏
  • 举报
回复
楼主的问题是 源于Oracle不支持三层嵌套查询排序。Hibernate使用这种分页方式的话,其实就是三层嵌套查询,首先是对你的条件查找出结果集,然后对结果集分页,因为Oracle不支持由此产生了第一页中的某些数据会在第二页中出现,解决的方法是自己写sql或者是使用其他的内置对像分页方式
UPC_思念 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cbxjj 的回复:]

而且hibernate有自带的分页方法 不需要你去写
setFirstResult();
setMaxResult();
配置好数据库方言会自动帮你转换为各数据库的分页语句
[/Quote]

对头,Oracle的那个有子查询影响速度
acfi66 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhouyou96 的回复:]
引用 2 楼 acfi66 的回复:
这个问题我也遇到过,只是不是用的hibernate,应该是oracle自身的问题


hibernate在查询第一页时与查询第二页及之后页时,生成的查询代码都不同,这肯定是hibernate的问题啊,如果在查询第一页时时,也使用:
select * from (select row_.*,rownum rownum_ from (myquery) r……
[/Quote]
hibernate分页第一页和第二页肯定是不一样的,这是它的效率考虑的原因,你说的数据第一页和第二页重复就是oracle的问题,我以前就碰到过这样的问题
剑神一笑 2011-07-26
  • 打赏
  • 举报
回复
那就是你的sql写的有问题
帖sql
zn85600301 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhouyou96 的回复:]

引用 8 楼 zn85600301 的回复:
加上 order by 主键


1.我的代码中 myquery 部分是包含order by的
2.不一定要按主键排序吧?实际的业务情况,有些是不能按主键排序的。
[/Quote]
有可能 myquery 部分的排序大面积重复 所以没有一个标识
oracle 每次查询返回的结果顺序不是相同的
order by 支持按多列排序 你可以在最后加上 id 不影响什么
zhouyou96 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jianglang_a 的回复:]
select * from (select rownum ro,t.* from xxx t) where rownum<=10 and ro>5

没问题
[/Quote]

你试试看:
select * from (select t.* from xxx t order by t.x1 asc) where rownum<=10

select * from (select row_.*,row_.rownum rownum_ from (select t.* from xxx t order by t.x1 asc) row_) where rownum_<=10 and rownum_>0

这两种结果是不一样的,现在的问题就是我发现Hibernate里,第一页是采用的上者的方式,而非第一页时采用的是下者的方式。
zhouyou96 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zn85600301 的回复:]
加上 order by 主键
[/Quote]

1.我的代码中 myquery 部分是包含order by的
2.不一定要按主键排序吧?实际的业务情况,有些是不能按主键排序的。
zhouyou96 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cbxjj 的回复:]
而且hibernate有自带的分页方法 不需要你去写
setFirstResult();
配置好数据库方言会自动帮你转换为各数据库的分页语句
[/Quote]
我的代码就是
x.setFirstResult(start);
x.setMaxResult(size);
list = x.list();

问题是hibernate在生成目标查询代码的时候,第一页和非第一页的查询代码是不同的。
zn85600301 2011-07-26
  • 打赏
  • 举报
回复
加上 order by 主键
zhouyou96 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acfi66 的回复:]
这个问题我也遇到过,只是不是用的hibernate,应该是oracle自身的问题
[/Quote]

hibernate在查询第一页时与查询第二页及之后页时,生成的查询代码都不同,这肯定是hibernate的问题啊,如果在查询第一页时时,也使用:
select * from (select row_.*,rownum rownum_ from (myquery) row_) where rownum_<=10 and rownum_>0
是不会有任何问题的,但hibernate偏偏在查询第一页时,使用:
select * from (myquery) where rownum<=10

这样会导致查询结果的顺序不一致的啊,这应该是hibernate的BUG吧。

剑神一笑 2011-07-26
  • 打赏
  • 举报
回复
而且hibernate有自带的分页方法 不需要你去写
setFirstResult();
setMaxResult();
配置好数据库方言会自动帮你转换为各数据库的分页语句
亲努力啊 2011-07-26
  • 打赏
  • 举报
回复
你写的SQL不对
亲努力啊 2011-07-26
  • 打赏
  • 举报
回复

select * from (select rownum ro,t.* from xxx t) where rownum<=10 and ro>5

没问题
剑神一笑 2011-07-26
  • 打赏
  • 举报
回复
帖代码
acfi66 2011-07-26
  • 打赏
  • 举报
回复
这个问题我也遇到过,只是不是用的hibernate,应该是oracle自身的问题
lequery 2011-07-26
  • 打赏
  • 举报
回复
你排序的话是整体100条记录都排序 还是就排10条啊?
肯定是你的SQL语句写的问题啊

67,517

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧