快速业务通道

JPA 2.0中的动态类型安全查询 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
整限定名及其静态字段的名称),应用程序也能够编写这些元模型类。如果应用程序开发人员编写元模型类,这些类就称为非规范元模型。现在,关于非规范元模型的规范还不是很详细,因此对非规范元模型的支持不能在 JPA 提供者之间移植。您可能已经注意到,公共静态字段仅在规范元模型中声明,而没有初始化。声明之后就可以在开发 CriteriaQuery 时引用这些字段。但是,必须在运行时给它们赋值才有意义。尽管为规范元模型的字段赋值是 JPA 提供者的责任,但非规范元模型则不存在这一要求。使用非规范元模型的应用程序必须依赖于特定供应商机制,或开发自己的机制来在运行时初始化元模型属性的字段值。

代码生成和可用性

自动生成源代码通常让人担心。为规范元模型生成源代码更是如此。生成的类在开发期间使用,构建 CriteriaQuery 的其他代码部分直接在运行时引用它们,从而留下一些可用性问题:

生成的源代码文件应该在初始源代码所在的目录中,还是在一个独立的或与输出目录相关的目录中?

是否应该在版本控制配置管理系统中检查源代码文件?

如何维护初始 Person 实体定义及其规范 Person_ 元模型之间的对应关系?例如,如果要编辑 Person.java 以添加其他持久化属性,或通过重构重命名持久化属性,那么应该怎么办呢?

在撰写本文时,这些问题还没有确切的答案。

注释处理和元模型生成

如果您有许多持久化实体,您将倾向于不亲自编写元模型类,这是很自然的事情。持久化提供者应该 为您生成这些元模型类。在规范中没有强制规定这种工具或生成机制,但是 JPA 之间已经私下达成共识,他们将使用在 Java 6 编译器中集成的 Annotation Processor 工具生成规范元模型。Apache OpenJPA 提供一个工具来生成这些元模型类,其生成方式有两种,一是在您为持久化实体编译源代码时隐式地生成,二是通过显式地调用脚本生成。在 Java 6 以前,有一个被广泛使用的称为 apt 的 Annotation Processor 工具,但在 Java 6 中,编译器和 Annotation Processor 的合并被定义为标准的一部分。

要像持久化提供者一样在 OpenJPA 中生成这些元模型类,仅需在编译器的类路径中使用 OpenJPA 类库编译 POJO 实体:

$ javac domain/Person.java 

将生成规范元模型 Person_ 类,它将位于 Person.java 所在的目录,并且作为该编译的一部分。

编写类型安全的查询

到目前为止,我已经构建了 CriteriaQuery 的组件和相关的元模型类。现在,我将展示如何使用 Criteria API 开发一些查询。

函数表达式

函数表达式将一个函数应用到一个或多个输入参数以创建新的表达式。函数表达式的类型取决于函数的性质及其参数的类型。输入参数本身可以是表达式或文本值。编译器的类型检查规则与 API 签名结合确定什么是合法输入。

考虑一个对输入表达式应用平均值的单参数表达式。CriteriaQuery 选择所有 Account 的平均余额,如清单 5 所示:

清单 5. CriteriaQuery 中的函数表达式

CriteriaQuery<Double> c = cb.createQuery(Double.class); Root<Account> a = c.from(Account.class); c.select(cb.avg(a.get(Account_.balance)));

等效的 JPQL 查询为:

String jpql = "select avg(a.balance) from Account a";

在 清单 5 中,QueryBuilder 工厂(由变量 cb 表示)创建一个 avg() 表达式,并将其用于查询的 select() 子句。

Fluent API

如这个例子所示,Criteria API 方法经常返回可以直接在相关方法中使用的类型,从而提供了一种称为 Fluent API 的流行编程风格。

该查询表达式是一个构建块,可以通过组装它为查询定义最后的选择谓词。清单 6 中的例子显示了通过导航到 Account 的余额创建的 Path 表达式,然后 Path 表达式被用作两个二

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号