如何离开连接在Hibernate中获取多个子节点?

Bjo*_*aut 18 hibernate hql fetch

我正在使用hibernate,我遇到了创建一个hql查询的问题,该查询获取了我对象的所有子项.

例如:对象用户有一个汽车列表和一个好友列表.

为了让用户获得他的汽车,我将使用以下查询:

from User u left join fetch u.cars where u.id = ?
Run Code Online (Sandbox Code Playgroud)

这工作得很好,所以我认为这将是很容易得到用户用他的车和他的朋友与以下查询:

from User u left join fetch u.cars left join fetch u.friends where u.id = ?
Run Code Online (Sandbox Code Playgroud)

但这给了我以下错误:

HibernateException:无法同时获取多个包

现在我的问题是:在hibernate中获取多个子节点的正确方法是什么?

JB *_*zet 13

最多一个子集合必须是一个包(即声明为List).将其他集合声明为集合,它将起作用.

但要注意,执行此类提取连接会产生行的cartesiann产品.如果两个集合都有100个元素,则此类查询将从数据库中检索10,000行.执行获取一个集合的第一个查询和另一个获取另一个集合的第二个查询(有效地将检索到的行数减少到200个)更有效.这也是一种避免问题的方法:

select u from User u left join fetch u.cars where u.id = :id;
select u from User u left join fetch u.friends where u.id = :id;
Run Code Online (Sandbox Code Playgroud)


小智 9

你刚刚点击了Collection/List(bag)问题.

以下是Hibernate官方"问题"的链接:https://hibernate.atlassian.net/browse/HHH-1718.如您所见,它已于2006年开放并仍然开放.

除了JB Nizet建议的内容之外,我建议您在模型中使用Set而不是Collection或List(如果可以的话),否则,您还可以将Collection/List指定为FetchMode.SUBSELECT并作为最后一个选项(实现起来很痛苦) ),您可以在@ OneToMany/@ ManyToMany上使用@IndexColumn.

本博客文章将指导您实施解决方案:http://jroller.com/eyallupu/entry/hibernate_exception_simultaneously_fetch_multiple

换句话说,除了解决方法之外,没有任何解决方案可以完全按照您的要求执行操作.

希望这可以帮助!

编辑:错字