我已经对大型数据库表实现了ScrollableResults的用法,一切工作正常,直到我想对另一个使用联接的表做同样的事情。

我遇到问题的实体有一些一对多的关联,因此我必须使用DISTINCT来避免重复。当我使用list()获取查询结果时,一切工作正常。但是,当我使用scroll()时,DISTINCT似乎被完全忽略了-我得到很多重复。

Query query = gameSession.createQuery("SELECT DISTINCT c FROM City c JOIN FETCH c.inhabitans i");


效果很好,列表没有重复项:

List<City> list = query.list();


这是行不通的(给很多重复项,就像不会使用DISTINCT一样):

ScrollableResults sr = query.scroll(ScrollMode.FORWARD_ONLY);


当我使用Criteria而不是Query时,一切都相同。我仅发现有关此特定问题的三件事:


像我这样的几个问题没有答案,
bug描述的情况可能和我的完全一样,但是应该早就解决了,
在SO答案之一中,几乎没有评论说“当使用scroll()时,DISTINCT_ROOT_ENTITY不能很好地交互”。


这使ScrollableResults对我无用,但是由于节省了大量内存,我仍然需要它。您知道如何使用DISTINCT来获得滚动结果吗?或任何解决方法?

休眠版本:4.2.4; JDK 7; DB:MSSQL

最佳答案

在查询中添加带有根实体ID的“ order by”子句。

10-06 05:12
查看更多