JPA 和休眠 - 标准与 JPQL 或 HQL

使用标准HQL 的优缺点是什么?Criteria API 是一种在 Hibernate 中表达查询的面向对象的不错方式,但有时 Criteria Query 比 HQL 更难理解/构建。

何时使用标准和 HQL?在哪些用例中,您更喜欢什么?还是只是口味问题?


答案 1

我主要喜欢动态查询的标准查询。例如,根据某些参数动态添加一些排序或省略某些部分(例如限制)要容易得多。

另一方面,我将HQL用于静态和复杂的查询,因为它更容易理解/阅读HQL。另外,我认为HQL更强大一些,例如,对于不同的连接类型。


答案 2

HQL 和 criteriaQuery 在性能方面存在差异,每次使用 criteriaQuery 触发查询时,它都会为表名创建一个新的别名,该别名不会反映在任何数据库的上次查询缓存中。这会导致编译生成的 SQL 的开销,从而需要更多时间来执行。

关于获取策略 [http://www.hibernate.org/315.html]

  • 条件遵循映射中的懒惰设置,并保证加载要加载的内容。这意味着一个条件查询可能会导致多个 SQL 即时 SELECT 语句来获取包含所有非惰性映射关联和集合的子图。如果要更改“如何”甚至“什么”,请使用 setFetchMode() 为特定集合或关联启用或禁用外部联接提取。条件查询也完全遵循获取策略(联接、选择、子选择)。
  • HQL 遵循映射中的懒惰设置,并保证加载要加载的内容。这意味着一个 HQL 查询可能会导致多个 SQL 即时 SELECT 语句来获取具有所有非惰性映射关联和集合的子图。如果要更改“如何”甚至“什么”,请使用 LEFT JOIN FETCH 为特定集合或可为 null 的多对一或一对一关联启用外联接提取,或者使用 JOIN FETCH 为不可为 null 的多对一或一对一关联启用内部联接提取。HQL 查询不遵循映射文档中定义的任何 fetch=“join”。

推荐