一尘不染

我该如何解决N + 1选择问题?

hibernate

我很难理解如何避免在jpa或hibernate状态下进行n + 1选择。

从我阅读的内容来看,有一个“ left join fetch”,但是我不确定它是否仍然适用于多个列表(oneToMany)。

有人可以给我解释一下,还是给我一个带有清晰完整说明的链接?

很抱歉,如果这是一个菜鸟问题,但我找不到关于此问题的真正清晰的文章或文档。

谢谢


阅读 234

收藏
2020-06-20

共1个答案

一尘不染

除了联接之外,您还可以使用子选择。这将导致执行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参考中获取策略的章节 -与第一个内容相似,但更加详尽
2020-06-20