与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)是一个主要区别。



