我无法理解如何在jpa或hibernate中避免n + 1选择。
从我读到的,有'左连接提取',但我不确定它是否仍适用于多个列表(oneToMany)..
有人可以向我解释一下,或者给我一个明确完整解释的链接吗?
如果这是一个菜鸟问题,我很抱歉,但我找不到关于这个问题的真正明确的文章或文档。
由于
答案 0 :(得分:8)
除了加入,您还可以使用子选择。这导致执行2个查询(或者通常 m + 1,如果你有 m 列表),但它也适用于大量列表,不像连接取。
使用连接提取,如果您使用实体获取2个表(或列表),则会获得笛卡儿产品,即来自两个表的所有行对的组合。如果表格很大,结果可能是巨大的,例如如果两个表都有1000行,则笛卡尔积包含100万行!
此类案例的更好选择是使用子选择。在这种情况下,您将在主选择(加载父实体)的顶部发出2个选择 - 每个表一个 - 所以总共加载1 + 100 + 100行和3个查询。
对于记录,延迟加载相同会产生201个单独的选择,每个选择加载一行。
更新:以下是一些示例: