2015-11-24 151 views
1

我有一些争吵与Hibernate。 我的查询,但优化,是相当沉重。我的一个优化是限制返回的结果集。 所以与Hibernate我用的方法setMaxResultSet,但我打在这篇文章中描述了同样的问题:休眠HQL和setMaxResults

Hibernate: Pagination with setFirstResult and setMaxResult

(的问题是使用setMaxResultSet冬眠在某些情况下,包裹本查询:

select * from (your query) where rownum <= :rownum

所以,在这种情况下,解决办法是增加一个排序依据,BU我已经数以百万计的记录和排序依据杀死查询的执行时间。 我已经成功使用createNativeQuery和传球,我需要准确的查询(类似“my query where rownum <= :rownum" instead of "select * from (your query) where rownum <= :rownum", and goodbye portability)克服了这个问题,但老实说,我不知道为什么休眠这样的行为......

正如前面帖子建议,只要你的查询“不稳定”,hibernate就可以解析SQL,因为如果我没有误解,两次执行之间的记录顺序可能不一样,但我不明白方法可以解决这个稳定性问题

+1

很简单:如果你在查询中有'where rownum <=:rownum',则在应用'order by'之前应用*限制。因此,无论您在查询中使用什么顺序,它总是会返回相同的第一行。这显然不是你想要的:如果你按名字排序,你首先需要名字,而只有N个名字。不是任意N个第一行,按名称排序。 –

+0

我不认为它以这种方式工作......从我能看到直接在数据库试图查询,添加排序依据操作者再次杀人的执行时间,因此它似乎ROWNUM应用排序依据(我假设后DB是试图获取并为了所有符合查询,然后命令他们返回前N的记录) –

回答

0

我在hibernate中使用的是相同的分页,下面给出了HQL,它可能对你有用

(我)开始,你应该使用这个查询

List<Object> Entity_Cls_Lst= Objclass.createQuery("from library where book_id>Book_ID order by book_id").list(); 

(II)滚动你应该把最后的结果数据的Book_ID并传递给查询在条件之后。

List<Object> Entity_Cls_Lst= Objclass.createQuery("from library where book_id>Book_ID order by book_id").setMaxResults(MAX_RECORDS).list(); 
+0

我看到一对夫妇的有关解决的问题,首先是,我不能使用ORDER BY操作,因为它使查询致命地变慢,所以我既不能使用ID作为过滤器,导致我的记录的ID没有排序。 –

+0

我用的解决方案张贴在这里,它有时失败和结果,因为它类似于SQL提供了不正确的顺序: SELECT * FROM(查询),其中ROWNUM <=:ROWNUM 和上面的查询并不保证结果将给予根据有序的标准,rownum。更简单的方法是在java端迭代时处理有序结果。 –