回答

收藏

HQL:从热切表中获得联接集合

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-14

我有四个表:" x6 K/ U' b, m7 w5 @! Z
RootNode // Will return multiple root nodes SubNode // Will return one sub node per root nodeSubNodeChildren1 // Will return multiple for each sub nodeSubNodeChildren2 // Will return multiple for each sub node与实体结构相似:
  M5 ?/ C, D0 x1 z1 DRootNode -> SubNode -> SubNodeChildren                                                                               -> SubNodeChildren2我需要一个查询来返回所有人RootNodes与它在表SubNode和SubNode儿童初始化SubNode但是SubNode孩子懒惰牵强。/ ?/ J7 H8 N# o' F: Z
我知道如何编写查询,将查询LEFT OUTER JOINFETCH表的直接子级并相应初始化。但是,我不知道如何从顶表获得急需的子级。
3 F& n# ?1 e4 r) \, R我尝试过类似的事情:1 G5 c/ N) l& a9 q( M! m
SELECT rn FROM RootNode AS rn LEFT OUTER JOIN FETCH rn.SubNode.SubNodeChildren1但这总是给我一个错误,那就是主人不是SELECT的一部分。
1 F, Z' _: [, I4 D: h/ D( Z; h* _任何帮助都是极大的赞赏。
: l: \0 r0 b) c7 U                                                               
! S' g) d, e! {6 `" I4 Z, w% \    解决方案:                                                               
, M/ |  t0 O0 B! y2 q; {, w7 x2 E" a                                                                Hibernate参考
2 l- q: Y# U' d5 L( P我们可能需要别名的唯一原因是,如果我们以递归的方式加入另一个集合
1 n9 u. Q, g. i8 l( y' D这意味着你的查询应该重写为
# e$ Y6 n. V' d' O) P. @select distinct     rnfrom    RootNode rnleft join fetch     rn.subNode snleft join fetch     sn.subNodeChildren你可以, ?- Z6 e; u  h0 {
默认子节点禁用fetch = FetchType.EAGER并通过使用HQL查询和检索你真正想要的内容-它(HQL查询)有效地+ E" e/ _4 V# \! j
外部连接和惰性声明涵盖了相关和集合的映射文件    (Hibernate参考文件)。书中的行动POJO支持此方法。
; S0 Q& P5 p9 G0 j# \: l; k或将SubNodeChildren的集合启用为fetch = FetchType.EAGER2 K. X: G5 E# E& n% A( t
以下是从Hibernate FAQ从中提取的(链接已被禁用(据我所知),但在消失前已保存)
$ e2 D2 Q0 N& ?$ n/ \8 ~1 p在MVC在应用程序中,当视图试图访问它们时,如何确保所有代理和惰性集合都初始化?3 W8 u0 t8 Q: }0 }' Z) U4 Q/ l
一种可能的方法是在转发到视图时保持会话(而且事务没有提交)。例如,通过servlet显示视图后,过滤器将关闭/提交会话/事务(使用另一个示例)Maverick中的ModelLifetime.discard()回调)。这种方法的一个难题是,如果视图出现异常,确保会话/事务关闭/回滚。
: ~1 \  `  F. X9 f- y  Q2 }; a2 V  l& x- j& d$ m& X1 j
另一种方法是简单地使用它Hibernate.initialize()强制初始化所有需要的对象。这通常比听起来容易得多。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则