我看了一下JPA 2.0 Criteria API,但是与Hibernate Criteria不同,我发现它太麻烦了。是否有充分的理由使用JPA 2.0 Criteria API而不是使用JPA-QL?感谢您的意见。
与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实体类(由注释处理器生成)。它提供了一种强类型替代基于运行时反射的方法:
Person_
Person
Field field = Person.class.getField("age");
优点:
缺点:
总的来说,我对JPQL感到更自在,但Criteria API的类型安全性与JPQL(以及Hibernate Criteria API)是一个主要区别。