JPA 2.0 中的动态类型安全查询
2009-11-11 00:00:00 来源:WEB开发网核心提示: publicinterfaceTypedQuery<T>extendsQuery{List<T>getResultList();}与对应的无类型超接口相反:publicinterfaceQuery{ListgetResultList();}很明显,TypedQuery 结
public interface TypedQuery<T> extends Query {
List<T> getResultList();
}
与对应的无类型超接口相反:
public interface Query {
List getResultList();
}
很明显,TypedQuery 结果具有相同的 Person.class 类型,该类型在构造输入 CriteriaQuery 时由 QueryBuilder 指定(第 3 行)。
在第 8 行中,当最终执行查询以获得结果列表时,携带的类型信息展示了其优势。得到的结果是带有类型的 Person 列表,从而使开发人员在遍历生成的元素时省去麻烦的强制类型转换(同时减少了 ClassCastException 运行时错误)。
现在归纳 清单 2 中的简单例子的基本方面:
CriteriaQuery 是一个查询表达式节点树。在传统的基于字符串的查询语言中,这些表达式节点用于指定查询子句,比如 FROM、WHERE 和 ORDER BY。图 2 显示了与查询相关的子句:
图 2. CriteriaQuery 封装了传统查询的子句
图片看不清楚?请点击这里查看原图(大图)。
查询表达式被赋予泛型。一些典型的表达式是:
Root<T>,相当于一个 FROM 子句。
Predicate,其计算为布尔值 true 或 false(事实上,它被声明为 interface Predicate extends Expression<Boolean>)。
Path<T>,表示从 Root<?> 表达式导航到的持久化属性。Root<T> 是一个没有父类的特殊 Path<T>。
更多精彩
赞助商链接