JPA 2.0 中的动态类型安全查询
2009-11-11 00:00:00 来源:WEB开发网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 子句。
在第 7 行中,EntityManager 创建一个可执行查询,其输入为 CriteriaQuery。这类似于构造一个输入为 JPQL 字符串的可执行查询。但是由于输入 CriteriaQuery 包含更多的类型信息,所以得到的结果是 TypedQuery,它是熟悉的 javax.persistence.Query 的一个扩展。如其名所示,TypedQuery 知道执行它返回的结果的类型。它是这样定义的:
更多精彩
赞助商链接