Hibernate Criteria API 已弃用,但 JPA Criteria API 很复杂且几乎无法使用(例如用于连接)

gen*_* b. 5 hibernate jpa criteria-api hibernate-criteria

我的理解是 Hibernate Criteria API 已被弃用:

从 Hibernate 5.2 开始,应使用 JPA Criteria API

但在 Hibernate Criteria API 中,构建复杂的查询JOINs很容易。我可以这样做:

Criteria criteriaQuery = session.createCriteria(Request.class);
// 1. Prepare aliases (JOINs) from main table
if (!StringUtils.isBlank(searchCriteria.getRequestorName())) {
    criteriaQuery.createAlias("requestor", "npRequestor", JoinType.INNER_JOIN);
}
if (!StringUtils.isBlank(searchCriteria.getApproverName())) {
    criteriaQuery.createAlias("workflows", "wf", JoinType.INNER_JOIN);
    criteriaQuery.createAlias("wf.approver", "npApprover", JoinType.INNER_JOIN);
}
// Prepare criteria
// ...
criteriaQuery.add(Restrictions.eq("wf.someAttribute", someAttr));
}       
Run Code Online (Sandbox Code Playgroud)

但是在JPAJOINs Criteria API 中进行复杂的查询是极其困难的。正如该线程中的一位用户指出的那样,“我很难使用 Criteria API 创建复杂的联接,并且找不到大量的文档和示例。

简单的 Join 需要创建 a Metamodel(一个单独的进程),然后创建一个EntityType,并且语法很难构造。下面只是最简单的示例,但我有多个 If/Else 条件和多路联接。

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
EntityType<Owner> Owner_ = m.entity(Owner.class);

Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = cq.join(Pet_.owners).join(Owner_.addresses);
Run Code Online (Sandbox Code Playgroud)

为什么人们要搬起石头砸自己的脚?为什么要放弃完全可用的东西而选择笨重且难以使用的替代品?