我很难理解如何避免在jpa或hibernate状态下进行n + 1选择。
从我阅读的内容来看,有一个“ left join fetch”,但是我不确定它是否仍然适用于多个列表(oneToMany)。
有人可以给我解释一下,还是给我一个带有清晰完整说明的链接?
很抱歉,如果这是一个菜鸟问题,但我找不到关于此问题的真正清晰的文章或文档。
谢谢
除了联接之外,您还可以使用子选择。这将导致执行2个查询(或者,如果您有 m个 列表,则通常为 m + 1 ),但它也可以很好地扩展大量列表,这与联接获取不同。 __
使用join fetching,如果您使用实体获取2个表(或列表),则会得到 笛卡尔乘积 ,即两个表中的行对的所有组合。如果表很大,结果可能会 很大 ,例如,如果两个表都有1000行,则笛卡尔乘积将包含100万行!
对于这种情况,更好的选择是使用子选择。在这种情况下,您将在主选择(将加载父实体)的顶部发出2个选择(每个表一个),因此,总共要加载3行查询的1 + 100 + 100行。
对于记录,与延迟加载相同将导致201个单独的选择,每个选择都加载一行。
更新: 这是一些示例: