当前位置: 首页 > 面试题库 >

HQL:从渴望表中获取联接集合

汲永嘉
2023-03-14
问题内容

我有四个表:

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与它在表SubNodeSubNode孩子初始化。该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