JPA 2.0 中的动态类型安全查询
2009-11-11 00:00:00 来源:WEB开发网在第 3 行,QueryBuilder 工厂构造一个 CriteriaQuery 实例。CriteriaQuery 被赋予泛型类型。泛型参数声明 CriteriaQuery 在执行时返回的结果的类型。在构造 CriteriaQuery 时,您可以提供各种结果类型参数 —— 从持久化实体(比如 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 用于构造一个表达式,它将计算第一个表达式参数的值是否大于第二个参数的值。方法签名为:
更多精彩
赞助商链接