如何在Hibernate中左联合获取多个子项?

如何在Hibernate中左联合获取多个子项?,hibernate,hql,fetch,Hibernate,Hql,Fetch,我正在使用hibernate,在创建获取对象所有子对象的hql查询时遇到了问题 例如:对象用户有一个汽车列表和一个朋友列表 要获取用户的汽车,我将使用以下查询: from User u left join fetch u.cars where u.id = ? from User u left join fetch u.cars left join fetch u.friends where u.id = ? 这很好用,所以我想通过以下查询可以很容易地找到一个拥有汽车和朋友的用户: from

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

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

要获取用户的汽车,我将使用以下查询:

from User u left join fetch u.cars where u.id = ?
from User u left join fetch u.cars left join fetch u.friends where u.id = ?
这很好用,所以我想通过以下查询可以很容易地找到一个拥有汽车和朋友的用户:

from User u left join fetch u.cars where u.id = ?
from User u left join fetch u.cars left join fetch u.friends where u.id = ?
但这给了我以下错误:

HibernateeException:无法同时提取多个行李


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

最多一个儿童收藏必须是一个包(即声明为列表)。将其他集合声明为集合,它将起作用

不过,请注意,这样做会产生行的笛卡尔乘积。如果两个集合都有100个元素,那么这样的查询将从数据库中检索10000行。有时,执行第一个查询(获取一个集合)和第二个查询(获取另一个集合)(从而将检索到的行数减少到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;

你刚刚提到了收集/列表(包)问题

下面是一个链接,指向有关此的Hibernate官方“问题”:。正如你所看到的,它已经在2006年开放,现在仍然开放

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

本博客文章将指导您实施解决方案:

换言之,除了变通办法之外,没有任何解决方案可以完全满足您的需求

希望这有帮助


编辑:打字错误不可能,因为它对应用程序/数据库来说太重了, 您需要创建两个单独的条件并分别检索数据

Cat cat = sess.createCriteria(Cat.class)
              .add(Restrictions.like("name", "F%"))
              .uniqueResult();

List kitten = sess.createCriteria(Kitten.class)
                  .add(Restrictions.eq("cat", cat))
                  .createCriteria("kittens")
                  .add(Restrictions.like("name", "F%"))
                  .list();

List mate = sess.createCriteria(Mate.class)
                .add(Restrictions.eq("cat", cat))
                .createCriteria("mate")
                .add(Restrictions.like("name", "F%"))
                .list();

很高兴知道。从直觉上看,scond查询是否会在第一个查询加载的相同用户实体上填充friends集合并不明显。但这就是它的工作原理(多亏了缓存)!这两个HSQL查询是否可以写入一个
@NamedQuery
?@MyTitle:否。命名查询是一个查询,而不是两个。如何使用JPA条件执行两个查询?我试过了,但找不到任何例子。我需要实现您的解决方案,因为我无法从一个列表更改为另一个集合或任何其他替代方案来避免这种情况。@Pablo您先执行一个查询,然后再执行另一个查询。我相信您会找到一个示例,演示如何轻松执行一个条件查询。重复:。使用Hibernate时:@LazyCollection(LazyCollectionOption.FALSE)的可能重复项