JPA 2.0 中的动态类型安全查询
2009-11-11 00:00:00 来源:WEB开发网JPQL 查询被指定为一个 String(第 2 行)。
EntityManager 是构造一个包含给定 JPQL 字符串的可执行 查询实例的工厂(第 3 行)。
查询执行的结果包含无类型的 java.util.List 的元素。
但是这个简单的例子有一个验证的错误。该代码能够顺利通过编译,但将在运行时失败,因为该 JPQL 查询字符串的语法有误。清单 1 的第 2 行的正确语法为:
String jpql = "select p from Person p where p.age > 20";
不幸的是,Java 编译器不能发现此类错误。在运行时,该错误将出现在第 3 或第 4 行(具体行数取决于 JPA 提供者是否在查询构造或执行期间根据 JPQL 语法解析 JPQL 字符串)。
类型安全查询如何提供帮助?
Criteria API 的最大优势之一就是禁止构造语法错误的查询。清单 2 使用 CriteriaQuery 接口重新编写了 清单 1 中的 JPQL 查询:
清单 2. 编写 CriteriaQuery 的基本步骤
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();
清单 2 展示了 Criteria API 的核心构造及其基本使用:
第 1 行通过几种可用方法之一获取一个 EntityManager 实例。
在第 2 行,EntityManager 创建 QueryBuilder 的一个实例。QueryBuilder 是 CriteriaQuery 的工厂。
赞助商链接