我有四张桌子:
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我需要一个查询,它将返回表中初始化了SubNode和SubNode子元素的所有RootNodes。SubNode是急切获取的,而SubNode子级是延迟获取的。
我知道如何编写一个查询,该查询将LEFT OUTER JOIN FETCH表的直接子级并相应地初始化它们。但是,我不知道如何抓取从顶级表中获取的表的子表。
我尝试过这样的方法:
SELECT rn FROM RootNode AS rn LEFT OUTER JOIN FETCH rn.SubNode.SubNodeChildren1但是,这总是给我一个错误,即所有者不是SELECT的一部分。
任何帮助都是非常感谢的。
发布于 2010-08-19 12:06:51
Hibernate引用开始了
如果我们要递归连接获取另一个集合,我们可能需要别名的唯一原因是
这意味着您的查询应该重写为
select distinct
rn
from
RootNode rn
left join fetch
rn.subNode sn
left join fetch
sn.subNodeChildren您可以选择
禁用默认的subNode查询,通过使用HQL fetch=FetchType.EAGER - It (HQL查询)有效地覆盖关联和集合的映射文件的外连接和惰性声明(Hibernate参考文档),只检索您真正想要的内容。POJO在《行动》一书中支持这种方法。
或启用以fetch=FetchType.EAGER形式收集SubNodeChildren
以下内容摘自Hibernate常见问题解答(链接已被禁用(据我所知),但我在消失前保存了链接)
在MVC应用程序中,当视图试图访问所有代理和惰性集合时,我们如何确保它们都将被初始化?
一种可能的方法是在转发到视图时保持会话打开(和事务未提交)。例如,在servlet过滤器中呈现视图之后,会话/事务将被关闭/提交(另一个示例是在Maverick中使用ModelLifetime.discard()回调)。这种方法的一个困难是确保在呈现视图时出现异常时关闭/回滚会话/事务。
..。
另一种方法是使用Hibernate.initialize()简单地强制初始化所有需要的对象。这通常比听起来更简单。
发布于 2010-08-19 23:15:17
为了让查询正常工作,我必须在渴望的实体上执行INNER JOIN FETCH而不是LEFT OUTER JOIN FETCH:
SELECT rn FROM RootNode AS rn INNER JOIN FETCH rn.SubNode AS sn LEFT OUTER JOIN FETCH sn.SubNodeChildren1 LEFT OUTER JOIN FETCH sn.SubNodeChildren2 ...老实说,我仍然不能确切地确定为什么它在INNER JOIN FETCH和LEFT OUTER JOIN FETCH上工作,但它肯定能完全按照我的需要工作。
https://stackoverflow.com/questions/3516873
复制相似问题