JPA 2.0中的动态类型安全查询 - 编程入门网
,您可以提供各种结果类型参数 —— 从持久化实体(比如 Person.class)到形式更加灵活的 Object[]。
第 4 行在 CriteriaQuery 实例上设置了查询表达式。查询表达式是在一个树中组装的核心单元或节点,用于指定 CriteriaQuery。图 1 显示了在 Criteria API 中定义的查询表达式的层次结构: 图 1. 查询表达式中的接口层次结构 首先,将 CriteriaQuery 设置为从 Person.class 查询。结果返回 Root<Person> 实例 p。Root 是一个查询表达式,它表示持久化实体的范围。Root<T> 实际上表示:“对所有类型为 T 的实例计算这个查询。” 这类似于 JPQL 或 SQL 查询的 FROM 子句。另外还需要注意,Root<Person> 是泛型的(实际上每个表达式都是泛型的)。类型参数就是表达式要计算的值的类型。因此 Root<Person> 表示一个对 Person.class 进行计算的表达式。 第 5 行构造一个 Predicate。Predicate 是计算结果为 true 或 false 的常见查询表达式形式。谓词由 QueryBuilder 构造,QueryBuilder 不仅是 CriteriaQuery 的工厂,同时也是查询表达式的工厂。QueryBuilder 包含构造传统 JPQL 语法支持的所有查询表达式的 API 方法,并且还包含额外的方法。在 清单 2 中,QueryBuilder 用于构造一个表达式,它将计算第一个表达式参数的值是否大于第二个参数的值。方法签名为: Predicate gt(Expression<? extends Number> x, Number y); 这个方法签名是展示使用强类型语言(比如 Java)定义能够检查正确性并阻止错误的 API 的好例子。该方法签名指定,仅能将值为 Number 的表达式与另一个值也为 Number 的表达式进行比较(例如,不能与值为 String 的表达式进行比较): Predicate condition = qb.gt(p.get(Person_.age), 20); 第 5 行有更多学问。注意 qb.gt() 方法的第一个输入参数:p.get(Person_.age),其中 p 是先前获得的 Root<Person> 表达式。p.get(Person_.age) 是一个路径表达式。路径表达式是通过一个或多个持久化属性从根表达式进行导航得到的结果。因此,表达式 p.get(Person_.age) 表示使用 Person 的 age 属性从根表达式 p 导航。您可能不明白 Person_.age 是什么。您可以将其暂时看作一种表示 Person 的 age 属性的方法。我将在谈论 JPA 2.0 引入的新 Metamodel API 时详细解释 Person_.age。 如前所述,每个查询表达式都是泛型的,以表示表达式计算的值的类型。如果 Person.class 中的 age 属性被声明为类型 Integer (或 int),则表达式 p.get(Person_.age) 的计算结果的类型为 Integer。由于 API 中的类型安全继承,编辑器本身将对无意义的比较抛出错误,比如: Predicate condition = qb.gt(p.get(Person_.age, "xyz")); 第 6 行在 CriteriaQuery 上将谓词设置为其 WHERE 子句。 JPA 2.0中的动态类型安全查询(3)时间:2011-02-03 IBM Pinaki Poddar在第 7 行中,EntityManager 创建一个可执行查询,其输入为 CriteriaQuery。这类似于构造一个输入为 JPQL 字符串的可执行查询。但是由于输入 CriteriaQuery 包含更多的类型信息,所以得到的结果是 TypedQuery,它是熟悉的 javax.persistence.Query 的一个扩展。如其名所示,TypedQuery 知道执行它返回的结果的类型。它是这样定义的:
与对应的无类型超接口相反:
很明显,TypedQuery 结果具有相同的 Person.class 类型,该类型在构造输入 CriteriaQuery 时由 QueryBuilder 指定(第 3 行)。 在第 8 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |