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)
为什么人们要搬起石头砸自己的脚?为什么要放弃完全可用的东西而选择笨重且难以使用的替代品?
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |