快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
进制函数表达式( greaterThan() 和 lessThan())的输入表达式,这两个表达式的结果都是一个布尔表达式或一个谓词。然后,通过 and() 操作合并谓词以形成最终的选择谓词,查询的 where() 子句将计算该谓词:

JPA 2.0中的动态类型安全查询(8)

时间:2011-02-03 IBM Pinaki Poddar

清单 6. CriteriaQuery 中的 where() 谓词

CriteriaQuery<Account> c = cb.createQuery(Account.class); Root<Account> account = c.from(Account.class); Path<Integer> balance = account.get(Account_.balance); c.where(cb.and      (cb.greaterThan(balance, 100),      cb.lessThan(balance), 200)));

等效的 JPQL 查询为:

"select a from Account a where a.balance>100 and a.balance<200";

符合谓词

某些表达式(比如 in())可以应用到多个表达式。清单 7 给出了一个例子:

清单 7. CriteriaQuery 中的多值表达式

CriteriaQuery<Account> c = cb.createQuery(Account.class); Root<Account> account = c.from(Account.class); Path<Person> owner = account.get(Account_.owner); Path<String> name = owner.get(Person_.name); c.where(cb.in(name).value("X").value("Y").value("Z"));

这个例子通过两个步骤从 Account 进行导航,创建一个表示帐户所有者的名称的路径。然后,它创建一个使用路径表达式作为输入的 in() 表达式。in() 表达式计算它的输入表达式是否等于它的参数之一。这些参数通过 value() 方法在 In<T> 表达式上指定,In<T> 的签名如下所示:

In<T> value(T value);

注意如何使用 Java 泛型指定仅对值的类型为 T 的成员计算 In<T> 表达式。因为表示 Account 所有者的名称的路径表达式的类型为 String,所以与值为 String 类型的参数进行比较才有效,String 值参数可以是字面量或计算结果为 String 的另一个表达式。

将 清单 7 中的查询与等效(正确)的 JPQL 进行比较:

"select a from Account a where a.owner.name in (''X'',''Y'',''Z'')";

在 JPQL 中的轻微疏忽不仅不会被编辑器检查到,它还可能导致意外结果。例如:

"select a from Account a where a.owner.name in (X, Y, Z)";

JPA 2.0中的动态类型安全查询(9)

时间:2011-02-03 IBM Pinaki Poddar

连接关系

尽管 清单 6 和 清单 7 中的例子将表达式用作构建块,查询都是基于一个实体及其属性之上的。但是查询通常涉及到多个实体,这就要求您将多个实体连接 起来。CriteriaQuery 通过类型连接表达式 连接两个实体。类型连接表达式有两个类型参数:连接源的类型和连接目标属性的可绑定类型。例如,如果您想查询有一个或多个 PurchaseOrder 没有发出的 Customer,则需要通过一个表达式将 Customer 连接到 PurchaseOrder,其中 Customer 有一个名为 orders 类型为 java.util.Set<PurchaseOrder> 的持久化属性,如清单 8 所示:

清单 8. 连接多值属性

CriteriaQuery<Customer> q = cb.createQuery(Customer.class); Root<Customer> c = q.from(Customer.class); SetJoin<Customer, PurchaseOrder> o = c.join(Customer_.orders);

连接表达式从根表达式 c 创建,持久化属性 Customer.orders 由连接源(Customer)和 Customer.orders 属性的可绑定类型进行参数化,可绑定类型是 PurchaseOrder 而不是 已声明的类型 java.util.Set<PurchaseOrder>。此外还要注意,因为初始属性的类型为 java.u

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号