WEB开发网
开发学院软件开发Java JPA 2.0 中的动态类型安全查询 阅读

JPA 2.0 中的动态类型安全查询

 2009-11-11 00:00:00 来源:WEB开发网   
核心提示: JPQL 查询被指定为一个 String(第 2 行),EntityManager 是构造一个包含给定 JPQL 字符串的可执行 查询实例的工厂(第 3 行),JPA 2.0 中的动态类型安全查询(2),查询执行的结果包含无类型的 java.util.List 的元素,但是这个简单的例子有一个验

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 的工厂。

上一页  1 2 3 4 5 6 7  下一页

Tags:JPA 动态 类型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接