java - Hibernate - n+1 一对一的选择查询

标签 java hibernate hql

组织以 1 对 1 的方式映射到地址:

组织:

<one-to-one class="Address" constrained="true" name="address" property-ref="organizationId"/>

地址:

<many-to-one class="Organization"  name="organization">
          <column name="OrganizationID" not-null="false" unique="true"/>
  </many-to-one>

此查询为每个组织 + 1 生成附加选择:

   query = session.createQuery("select o from Organization as o where o.isCool=0").setReadOnly(true);
   organizations = query.list();

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html告诉 fetch="join" 但这没有任何区别。如何解决这个问题呢?任何帮助表示赞赏。

编辑 在调试器中我可以看到该地址实际上不是延迟加载的,我不知道为什么。

最佳答案

由于您使用 HQL 来获取内容,因此简单地使用您正在尝试的注释或属性来避免 n+1 问题是无济于事的。

正确的解决方案是在查询中使用“FETCH JOIN”子句。您可以点击以下链接了解更多详情: http://www.realsolve.co.uk/site/tech/hib-tip-pitfall.php?name=n1selects

关于java - Hibernate - n+1 一对一的选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9737966/

相关文章:

java - 使用 JPA 和 Hibernate (NotNull) 映射集合的最新子项

java - 在 Spring 中将正则表达式查询与 hibernate 一起使用

c# - NHibernate GroupBy 和 Sum

java - 左循环旋转一个 ArrayList 然后获取最大元素的索引

java - 对象实例化另一个对象?

java - Hibernate 返回整数值

hibernate - 在 hibernate 中使用 bool 字段获取值

java - 使用 NamedQuery 更新 hibernate 中的查询

java - 单击链接时执行 Servlet

java - 为每个结果发送一个参数