除了联接之外,您还可以使用子选择。这将导致执行2个查询(或者,如果您有 m个 列表,则通常为 m + 1
),但它也可以很好地扩展大量列表,这与联接获取不同。 __
使用join fetching,如果您使用实体获取2个表(或列表),则会得到 笛卡尔乘积 ,即两个表中的行对的所有组合。如果表很大,结果可能会 很大
,例如,如果两个表都有1000行,则笛卡尔乘积将包含100万行!
对于这种情况,更好的选择是使用子选择。在这种情况下,您将在主选择(将加载父实体)的顶部发出2个选择(每个表一个),因此,总共要加载3行查询的1 + 100
+ 100行。
对于记录,与延迟加载相同将导致201个单独的选择,每个选择都加载一行。
更新: 这是一些示例:
- 一个教程:Tuning Lazy Fetching,最后有一个关于subselect的部分(顺便说一句,它也解释了n + 1 selects问题以及所有解决该问题的策略),
- Hibernate参考中的HQL子查询示例,
- 以防万一,从Hibernate参考中获取策略的章节 -与第一个内容相似,但更加详尽



