有哪些现实世界的例子,更优选JPA2 Criteria API?

Jos*_*ogi 24 java hibernate jpa jpa-2.0

我已经看了JPA 2.0 Criteria API,但我发现它与Hibernate Criteria不同,太麻烦了.是否有充分的理由使用JPA 2.0 Criteria API而不是使用JPA-QL?感谢您的意见.

Pas*_*ent 36

与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();
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,以下内容会引发编译错误,例如:

Predicate condition = qb.gt(p.get(Person_.age, "xyz"));
Run Code Online (Sandbox Code Playgroud)

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

Field field = Person.class.getField("age");
Run Code Online (Sandbox Code Playgroud)

优点:

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

缺点:

  • 更冗长.
  • 不太可读.

我觉得JPQL一般都比较舒服,但Criteria API的类型安全性与JPQL(以及Hibernate Criteria API)有很大的不同.

也可以看看

相关答案