【问题标题】:Hibernate Query Language (HQL) - Queries for lazy/no-lazy loadingHibernate Query Language (HQL) - 延迟/非延迟加载的查询
【发布时间】:2012-05-21 23:13:37
【问题描述】:

我有这样的结构:

  • A 包含 B 的集合(映射为非惰性)
  • B 包含 C 的集合(映射为非惰性)

我想做一个查询,检索 A 对象,其中包含 B 对象,其中没有 C 对象。那可能吗?另一种方法也适用于我(如果 B-C 关系被映射为惰性并且查询检索 A,包含 B 和 C)。

谢谢!

【问题讨论】:

标签: hibernate hql


【解决方案1】:

不,这是不可能的。由于您将关联本身标记为预先加载,因此 Hibernate 将始终预先加载此关联。

如果您将关联标记为惰性(toMany 关联的默认设置),那么您可以选择在查询中急切地获取它们,使用 join fetch

select a from A a left join fetch a.bs b left join fetch b.cs

请注意,如果两个集合都是袋子(即没有索引列的列表),这将不起作用。

【讨论】:

  • 您好,感谢您的回答。我也发现了这个话题,答案是一样的:stackoverflow.com/questions/3516873/… 但我在让它正常工作时遇到了一些麻烦——它多次乘以“A”。很可能是我的错误。
  • 解决了,需要“distinct”才能使其正常工作(我不是专家,我不知道有什么区别)。我会将此标记为正确答案,但如果您编辑它或告诉我区别在哪里会很好:)
  • 如果没有 distinct,Hibernate 每行 JDBC 结果集返回 1 个结果。这意味着如果你只有一个 A 和 2 个 B,每个 B 有 2 个 C,查询将返回 4 行,列表将包含 4 次相同的 A 实例。 distinct 关键字使 Hibernate 从列表中删除重复项.
  • 非常感谢,经过一天的努力,我已经解决了我的问题^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多