【问题标题】:Will Hibernate always generate one SQL for one HQL?Hibernate 是否总是为一个 HQL 生成一个 SQL?
【发布时间】:2013-12-22 17:43:37
【问题描述】:

执行两个简单的 SQL 查询通常比执行一个功能相同的复杂 SQL 查询要好。

Hibernate 是否曾尝试将这种优化用于 HQL(或 Criterias 或其他),还是总是只生成一个 SQL?

你可能会问,我为什么不写两个 HQL 查询,就像在 SQL 中一样。例如:

from User

简单的 HQL 查询,但由于所有预先加载的关联,它可能会生成非常复杂的 SQL。

理论上,Hibernate 可以只执行基本查询(SELECT * FROM user),收集一对一和一对多引用(id),然后进行第二次查询以收集这些 id 的行等。这可能是更快,尤其是当 User 中的参考 ID 基数较低时(它会产生较小的网络流量)。

问题是,Hibernate(或者可能是其他一些 JPA 实现?)是否可以使用这种优化?

谢谢。

【问题讨论】:

    标签: hibernate jpa hql criteria-api


    【解决方案1】:

    我认为您的问题没有答案,因为 Hibernate 本身与其他 JPA 实现有不同的版本,并且行为可能会在版本之间发生变化。另一方面,它实际上取决于您的上下文(例如,如果 OneToOne 关系是可选的,或者 no/column 是否可为空或否)。此外,它可能取决于您编写查询的方式。您通常会看到这种改进(尤其是在 OneToMany 关系的情况下),但正如我所说,没有这样的保证(就像在整个 IT 世界中一样)。

    【讨论】:

      【解决方案2】:

      简短的答案取决于。

      对于任何提供程序 JPA,您都可以真正配置您希望提供程序生成查询的方式。

      无论您使用哪种 API - 无论是编写 HQL/JPQL 还是使用 Criteria 查询或使用标准构建器 - 它们都会根据您配置 JPA/Hibernate 的方式生成查询。

      由于您使用 Hibernate 作为提供程序,因此特别针对您的问题,您可以设置获取策略。 FetchType 和 FetchMode。

      获取类型可以是{Lazy, Eager} 但是您会对 FetchMode 感兴趣,它可能是以下之一

      FetchMode.SELECT, FetchMode.JOIN, FetchMode.SUBSELECT
      

      根据您使用的FetchModeFetchType 的组合,您可以强烈定义Hibernate 如何生成查询。例如,FetchMode.JOIN 将使用 JOIN 在单个查询中获取结果和关系,而 FetchMode.SELECT 将使用不同的查询来获取子关系。

      您可以在 Hibernate 文档中阅读更多相关信息。 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多