为啥在 Hibernate 5 中不推荐使用条件查询?

Posted

技术标签:

【中文标题】为啥在 Hibernate 5 中不推荐使用条件查询?【英文标题】:Why is criteria query deprecated in Hibernate 5?为什么在 Hibernate 5 中不推荐使用条件查询? 【发布时间】:2016-11-21 17:43:22 【问题描述】:

我们已经知道,标准查询Hibernate 5 中已被弃用。在以前的 Hibernate 版本中,这是一个非常有用的特性。 而且它的性能仍然比 HQL 好。

那么它在Hibernate 5中被弃用的原因是什么?

而且这个问题不是this question 的重复,因为我想知道条件查询被弃用的原因。

这是来自here.

Hibernate 提供了一个旧的、遗留的org.hibernate.Criteria API,它 应视为已弃用。没有功能开发将针对 那些 API。最终,特定于 Hibernate 的标准功能将 移植为 JPA 的扩展 javax.persistence.criteria.CriteriaQuery。有关详细信息 org.hibernate.Criteria API,请参阅 Legacy Hibernate Criteria Queries。

【问题讨论】:

Hibernate 5 and Typed Criteria Queries (JPA2)的可能重复 来自docs:“新的开发应该专注于JPA javax.persistence.criteria.CriteriaQuery API。最终,特定于Hibernate 的标准功能将被移植为JPA javax.persistence.criteria.CriteriaQuery 的扩展。” 另外,如果您想编写清晰的查询(而不是使用笨拙的 Criteria API),请查看QueryDSL。 @MickMnemonic 不太重复。我编辑了我的问题。 我认为您引用的文档部分是不言自明的:他们不再想要开发特定于 Hibernate 的东西,而是鼓励用户针对接口 (JPA) 编写代码。现有的功能仍然可以在 Hibernate 5 中使用。 【参考方案1】:

我们将弃用 Criteria API 来代替 JPA 扩展支持。

考虑一下:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
HibernateCriteria hc = cb.unwrap( HibernateCriteria.class );
...
query.where( hc.someAwesomeThing( ... ) );
List<SomeEntity> entities = entityManager.createQuery( query ).getResultList();

与 cmets 不同,我们确实打算继续提供特定于 Hibernate 的功能,但我们希望通过标准 API 引入这些功能,而不是试图管理保留两个非常不同的 API同步互补。

【讨论】:

目前我的项目使用已弃用的 Criteria API。是否建议根据新建议使用 HQL 或 CriteriaBuilder 重写查询?

以上是关于为啥在 Hibernate 5 中不推荐使用条件查询?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate提交数据到数据库中,为啥查不到呢,数据库中已经可以查到了,是事物提交的问题吗?

为啥不推荐 HibernateDaoSupport?

为啥 PoolingClientConnectionManager 中不推荐使用所有方法?

为啥在 DOM 级别 3 中不推荐使用 DOMSubtreeModified 事件?

为啥在 DOM 级别 3 中不推荐使用 DOMSubtreeModified 事件?

理解为啥在 React 类组件中不推荐使用 super()