我已经对大型数据库表实现了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”子句。