当前位置: 首页 > 面试题库 >

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

雍骏俊
2023-03-14
问题内容

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

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

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

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

谢谢


问题答案:

除了联接之外,您还可以使用子选择。这将导致执行2个查询(或者,如果您有 m个 列表,则通常为 m + 1
),但它也可以很好地扩展大量列表,这与联接获取不同。 __

使用join fetching,如果您使用实体获取2个表(或列表),则会得到 笛卡尔乘积 ,即两个表中的行对的所有组合。如果表很大,结果可能会 很大
,例如,如果两个表都有1000行,则笛卡尔乘积将包含100万行!

对于这种情况,更好的选择是使用子选择。在这种情况下,您将在主选择(将加载父实体)的顶部发出2个选择(每个表一个),因此,总共要加载3行查询的1 + 100
+ 100行。

对于记录,与延迟加载相同将导致201个单独的选择,每个选择都加载一行。

更新: 这是一些示例:

  • 一个html" target="_blank">教程:Tuning Lazy Fetching,最后有一个关于subselect的部分(顺便说一句,它也解释了n + 1 selects问题以及所有解决该问题的策略),
  • Hibernate参考中的HQL子查询示例,
  • 以防万一,从Hibernate参考中获取策略的章节 -与第一个内容相似,但更加详尽


 类似资料:
  • 我使用Spring Data JPA作为持久性层,我面临着N+1问题。我也在使用规范API,因为它我发现很难解决N+1问题。请帮帮忙。 在Specification类中使用了fetch()而不是join()之后,我得到了以下问题:

  • 朋友们!我有这些实体: 文件: 所以,当我想用changeNotices获取文档时,这不是问题,我只有一个选择。但是当我想用文档获取ChangeNotice时,我有(n+1),首先是文档,n是changeNotices map。 我在查询中使用join fetch,但没有帮助。我认为问题在于,在文档中我有map ,其中实体是一个值,我应该使用@manytomany关系。在ChangeNotice中

  • 问题内容: 我有一组选择,所有选择都有相同的选项。然后,我通过过滤器运行这些选项,以便在其他选择中选择的任何选项都不会显示在选择中。请参阅此jsFiddle(在非IE浏览器中)以了解我的意思。基本上,我防止在选择中多次选择同一选项 现在,我所做的事情在IE中有问题。在IE中打开小提琴(我只在IE9中尝试过,但是我猜以前的版本有相同的问题)。将最后一个选择更改为AAA。请注意,其他三个选择如何改变了

  • 这个错误显示在logcat-java中。lang.NoSuchMethodError:没有静态方法zzce(Landroid/content/Context;)V类内Lcom/google/android/gms/common/GoogleAppAvailability;或者它的超类(声明'com.google.android.gms.common.GoogleAppAvailability'出现

  • 启动错误 ApplicationContext.若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-17 15:44:43.968错误10460--[main]O.S.Boot.SpringApplication:应用程序运行失败 我的pom.xml:

  • 问题内容: 什么是空指针异常,什么原因导致它们? 可以使用哪些方法/工具确定原因,以阻止异常导致程序过早终止? 问题答案: 声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,在其中声明基本类型的变量int: 在此示例中,变量是an ,Java会0为你初始化它。当你10在第二行为其分配值时,你的值将写入所指的存储位置x。 但是,当你尝试声明引用类型时,会发生一些不同的事情。采取以