我有四个表:
RootNode // Will return multiple root nodes
SubNode // Will return one sub node per root node
SubNodeChildren1 // Will return multiple for each sub node
SubNodeChildren2 // Will return multiple for each sub node
和类似的实体结构:
RootNode -> SubNode -> SubNodeChildren1
-> SubNodeChildren2
我需要一个查询将返回所有RootNodes
与它在表SubNode
和SubNode
孩子初始化。该SubNode
是预先抓取,但SubNode
孩子们是懒牵强。
我知道如何编写查询,将查询LEFT OUTER JOIN FETCH
表的直接子级并相应地对其进行初始化。但是,我不知道如何获取从顶层表急切获取的表的子级。
我已经尝试过类似的东西:
SELECT rn FROM RootNode AS rn LEFT OUTER JOIN FETCH rn.SubNode.SubNodeChildren1
但是,这总是给我一个错误,即所有者不是SELECT的一部分。
任何帮助是极大的赞赏。
Hibernate参考
我们可能需要别名的唯一原因是, 如果我们以递归方式加入以获取其他集合
这意味着您的查询应重写为
select distinct
rn
from
RootNode rn
left join fetch
rn.subNode sn
left join fetch
sn.subNodeChildren
你可以
禁用默认子节点fetch = FetchType.EAGER并通过使用HQL查询检索您真正想要的内容-它(HQL查询)有效地
覆盖了关联和集合的映射文件的外部联接和惰性声明 (Hibernate参考文档)。“行动”书中的POJO支持此方法。
或将SubNodeChildren的集合启用为fetch = FetchType.EAGER
以下是从Hibernate FAQ中提取的(该链接已被禁用(据我所知),但是我在消失之前已保存)
在MVC应用程序中,当视图尝试访问它们时,如何确保所有代理和惰性集合将被初始化?
一种可能的方法是在转发到视图时使会话保持打开状态(并且事务未提交)。在例如通过servlet过滤器呈现视图后,将关闭/提交会话/事务(另一个示例将使用Maverick中的ModelLifetime.discard()回调)。这种方法的一个难题是,如果在呈现视图时发生异常,则确保会话/事务被关闭/回滚。
…
另一种方法是简单地使用Hibernate.initialize()强制初始化所有需要的对象。这通常比听起来容易得多。
问题内容: 我有四个表: 和类似的实体结构: 我需要一个查询将返回所有与它在表和孩子初始化。该是预先抓取,但孩子们是懒牵强。 我知道如何编写查询,将查询表的直接子级并相应地对其进行初始化。但是,我不知道如何获取从顶层表急切获取的表的子级。 我已经尝试过类似的东西: 但是,这总是给我一个错误,即所有者不是SELECT的一部分。 任何帮助是极大的赞赏。 问题答案: Hibernate参考 我们可能需要
问题内容: 假设项目和出价是实体:一个项目有很多出价。它们在 Hibernate 中以典型的父/子关系映射: 在执行此查询后尝试访问每个项目的出价时,如何避免n + 1个选择? 请注意, 我需要 急切 的竞标价格,但 对收款 要有 进一步的限制 (b.amount> 100) 我尝试了以下失败: 问题答案: 这说明了为什么对fetch-joined集合添加限制会导致集合未初始化( 请注意 ,没有限
问题内容: 我有以下课程: 现在,我基本上想加载all ,但在适用时渴望加载条,所以我使用以下查询: 在这种情况下,似乎为Bar实体产生了SELECT N + 1问题: 是否可以告诉hibernate急切地为子集合中的每个元素加载一个关联,而无需诉诸N + 1 SELECT? 我尝试了以下查询,但由于它是一个集合,因此显然无法正常工作: 我也尝试使用,虽然这使我可以引用子集合,但似乎并没有急于加载
问题内容: 我有一个我认为应该很普遍的问题,但找不到答案。 我有2个对象:组和用户。我的课程如下所示: 现在,当我尝试从数据库中获取用户时,它带来了所有组,所有组都带来了所有用户,依此类推。最后,我遇到了stackoverflow异常。 如何解决此问题,并且仍然具有双向关联以及到达列表中对象的能力? 问题答案: 如果使用属性(无论如何都应使用)将双向关联的一侧设为关联的 拥有 侧,是否会遇到相同的
问题内容: 这是我的桌子: 每篇文章可以具有一个或多个与之关联的图像。我想在页面上显示最后40篇书面文章,以及与该文章相关的最新图像。我不知道的是如何与article_images表联接,并且仅检索单个行。 编辑:解决方案必须表现良好,这一点很重要。到目前为止,我所看到的解决方案(使用派生表)需要一分钟或更长时间才能完成。 问题答案: 在查看了其他答案之后,它帮助我意识到了一个潜在的问题。 Art
我在JavaEE(泽西)与JPA的应用程序,我有一个问题与未初始化的实体。我有3个实体汽车,业主,房子,汽车可以有多个业主和业主可以有多个房子。当我返回(entityManager.find)汽车然后车主被初始化。当我返回房子然后业主初始化,但车不是。我希望能够调用House.getOwner(). getCar(). getId()。现在我必须打电话给House,然后打电话给Owner以获得Ca