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

JPA和Hibernate中的N + 1问题有什么解决方案?

东郭弘方
2023-03-14
问题内容

我知道N + 1问题是执行一个查询以获取N个记录,执行N个查询以获取一些关系记录。

但是如何在Hibernate中避免这种情况?


问题答案:

假设我们有一个制造商类,与Contact有多对一关系。

我们通过确保初始查询能够获取在适当的初始化状态下加载所需对象所需的所有数据来解决此问题。一种方法是使用HQL提取联接。我们使用HQL

"from Manufacturer manufacturer join fetch manufacturer.contact contact"

与fetch语句。这导致内部联接:

select MANUFACTURER.id from manufacturer and contact ... from 
MANUFACTURER inner join CONTACT on MANUFACTURER.CONTACT_ID=CONTACT.id

使用条件查询,我们可以从中获得相同的结果

Criteria criteria = session.createCriteria(Manufacturer.class);
criteria.setFetchMode("contact", FetchMode.EAGER);

这将创建SQL:

select MANUFACTURER.id from MANUFACTURER left outer join CONTACT on 
MANUFACTURER.CONTACT_ID=CONTACT.id where 1=1

在这两种情况下,我们的查询都会返回已初始化联系人的Manufacturer对象的列表。只需要运行一个查询即可返回所需的所有联系方式和制造商信息

有关更多信息,请参见问题和解决方案的链接



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

  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 下面是问题的链接:SPOJ-ACTIV 我想出了这个问题的重现如下: 其中next()查找具有开始时间的活动的索引 这是我的java解决方案,虽然它通过了SPOJ工具包的许多测试用例,但是它确实为一些提供了WA。我的概念/解决方案有什么问题?

  • 问题内容: 有任何想法吗?为什么节点说“文件名未定义”?谢谢。合同,政策和发票功能不使用任何数据进行解析,仅使用resolve()。 问题答案: 首先,您不能写: (如果该函数返回 另一个 函数充当处理程序,则可以使用) 您必须写: 要么: 或者,如果一个函数应该处理其他函数的结果,则可能是这样: 作为参数传递给您的是函数,而不是调用函数的结果(在您的示例中这可能是一个承诺)。 我不知道这是否是您

  • 这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。 例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-

  • 我不确定numpy中(N,)和(N,1)之间的区别。假设两者都是一些特征,它们具有相同的N维,并且都有一个样本。有什么区别?