一尘不染

JPA2 Criteria API更可取的实际示例是什么?

hibernate

我看了JPA 2.0 Criteria API,但与Hibernate Criteria不同,我发现它过于繁琐。是否有充分的理由使用JPA 2.0
Criteria API而不是使用JPA-QL?感谢您的意见。


阅读 282

收藏
2020-06-20

共1个答案

一尘不染

像Hibernate Criteria API一样,JPA 2.0 Criteria API特别适合 动态
构建查询,以处理查询结构根据运行时条件而变化的情况。

但是还有更多。尽管比Hibernate的Criteria API更为冗长,但是JPA Criteria API允许构建 类型安全的
查询(如果您使用Metamodel API)。下面是一个例子:

EntityManager em = ...
QueryBuilder qb = em.getQueryBuilder();
CriteriaQuery<Person> c = qb.createQuery(Person.class);
Root<Person> p = c.from(Person.class);
Predicate condition = qb.gt(p.get(Person_.age), 20);
c.where(condition);
TypedQuery<Person> q = em.createQuery(c); 
List<Person> result = q.getResultList();

在以上代码段中,以下示例会引发编译错误:

Predicate condition = qb.gt(p.get(Person_.age, "xyz"));

如果您想知道,Person_静态的,实例化的,规范的元模型类,它
对应于原始Person实体类(由注释处理器生成)。它提供了一种强类型替代基于运行时反射的方法:

Field field = Person.class.getField("age");

优点:

  • 类型安全,编译时验证!
    • 禁止构造语法上不正确的查询。
    • 重构后可能引发编译错误。
    • 提供开箱即用的自动完成支持
  • 更适合动态查询。

缺点:

  • 更详细。
  • 可读性较差。

总的来说,我对JPQL感到更自在,但Criteria API的类型安全性与JPQL(以及Hibernate Criteria API)是一个主要区别。

也可以看看

2020-06-20