Hibernate查询集合返回的重复项是什么

时间:2014-01-09 19:56:57

标签: java hibernate

执行查询的hibernate documentation表示:

  

使用热切提取集合的查询通常返回   根对象的重复,但与他们的集合   已初始化。您可以通过Set。

过滤这些重复项

例如,如果我有一个Order类,其中OrderLines列表之间有one-to-many映射。那么如果我使用Hibernate查询,在这个上下文中我的Order类被称为根对象?那么为什么Hibernate想要加载重复的元素呢?

请帮助我理解这一点,我是Hibernate的新手,因此很难理解这个概念。

1 个答案:

答案 0 :(得分:4)

根实体是查询选择的实体:

select o from Order o ...

在这种情况下,oOrder类型的根。

现在,如果你这样做

select o from Order o left join fetch o.lines

并且您在数据库中有2个订单,每个订单有3行,然后底层SQL查询将返回6行,而Hibernate也将返回6个订单对象的列表。但是列表将包含第一个订单3次,第二个订单包含3次。

你可以通过

来避免这种情况
  • 使用Set<Order> deduplicated = new HashSet<Order>(listOfOrders)
  • distinct关键字添加到查询中:

    select distinct o from Order o left join fetch o.lines