像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)是一个主要区别。
也可以看看
- 使用Criteria API和metamodel API创建基本的类型安全查询
- JPA 2.0中的动态类型安全查询
- 比较JPQL,基于标准字符串和类型安全的查询
- JPA的类型安全标准查询API



