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

3

使用Hibernate查询时,为什么要加载重复元素?

执行查询的Hibernate文档表示:

使用集合的急切获取的查询通常会返回根对象的副本,但集合会被初始化。 您可以通过一个Set过滤这些重复项。

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

请帮助我理解这个概念,我是Hibernate新手,所以很难理解这个概念。

1个回答

4
根实体是由查询所选的实体:
select o from Order o ...

在这种情况下,o 是类型为 Order 的根节点。
现在如果你执行
select o from Order o left join fetch o.lines

如果在数据库中有2个订单,每个订单有3行数据,那么底层的SQL查询将返回6行数据,并且Hibernate也将返回一个包含6个Order对象的列表。但该列表将包含第一份订单的3个副本和第二份订单的3个副本。
您可以通过以下方式避免这种情况:
  • using Set<Order> deduplicated = new HashSet<Order>(listOfOrders)
  • adding the distinct keyword to the query:

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

非常感谢JB的快速回复 :) - Chaitanya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接