快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
til.Set,所以生成的连接表达式为 SetJoin,它是专门针对类型被声明为 java.util.Set 的属性的 Join。类似地,对于其他受支持的多值持久化属性类型,该 API 定义 CollectionJoin、ListJoin 和 MapJoin。(图 1 显示了各种连接表达式)。在 清单 8 的第 3 行不需要进行显式的转换,因为 CriteriaQuery 和 Metamodel API 通过覆盖 join() 的方法能够识别和区分声明为 java.util.Collection 或 List 或者 Set 或 Map 的属性类型。

在查询中使用连接在连接实体上形成一个谓词。因此,如果您想要选择有一个或多个未发送 PurchaseOrder 的 Customer,可以通过状态属性从连接表达式 o 进行导航,然后将其与 DELIVERED 状态比较,并否定谓词:

Predicate p = cb.equal(o.get(PurchaseOrder_.status), Status.DELIVERED)      .negate();

创建连接表达式需要注意的一个地方是,每次连接一个表达式时,都会返回一个新的表达式,如清单 9 所示:

清单 9. 每次连接创建一个唯一的实例

SetJoin<Customer, PurchaseOrder> o1 = c.join(Customer_.orders); SetJoin<Customer, PurchaseOrder> o2 = c.join(Customer_.orders); assert o1 == o2;

清单 9 中对两个来自相同表达式 c 的连接表达式的等同性断言将失败。因此,如果查询的谓词涉及到未发送并且值大于 $200 的 PurchaseOrder,那么正确的构造是将 PurchaseOrder 与根 Customer 表达式连接起来(仅一次),把生成的连接表达式分配给本地变量(等效于 JPQL 中的范围变量),并在构成谓词时使用本地变量。

使用参数

回顾一下本文初始的 JPQL 查询(正确那个):

String jpql = "select p from Person p where p.age > 20";

尽管编写查询时通常包含常量文本值,但这不是一个良好实践。良好实践是参数化查询,从而仅解析或准备查询一次,然后再缓存并重用它。因此,编写查询的最好方法是使用命名参数:

String jpql = "select p from Person p where p.age > :age";

参数化查询在查询执行之前绑定参数的值:

Query query = em.createQuery(jpql).setParameter("age", 20); List result = query.getResultList();

在 JPQL 查询中,查询字符串中的参数以命名方式(前面带有冒号,例如 :age)或位置方式(前面带有问号,例如 ?3)编码。在 CriteriaQuery 中,参数本身就是查询表达式。与其他表达式一样,它们是强类型的,并且由表达式工厂(即 QueryBuilder)构造。然后,可以参数化 清单 2 中的查询,如清单 10 所示:

清单 10. 在 CriteriaQuery 中使用参数

ParameterExpression<Integer> age = qb.parameter(Integer.class); Predicate condition = qb.gt(p.get(Person_.age), age); c.where(condition); TypedQuery<Person> q = em.createQuery(c); List<Person> result = q.setParameter(age, 20).getResultList();

比较该参数使用和 JPQL 中的参数使用:参数表达式被创建为带有显式类型信息 Integer,并且被直接用于将值 20 绑定到可执行查询。额外的类型信息对减少运行时错误十分有用,因为阻止参数与包含不兼容类型的表达式比较,或阻止参数与不兼容类型的值绑定。JPQL 查询的参数不能提供任何编译时安全。

清单 10 中的例子显示了一个直接用于绑定的未命名表达式。还可以在构造参数期间为参数分配第二个名称。对于这种情况,您可以使用这个名称将参数值绑定到查询。不过,您不可以使用位置参数。线性 JPQL 查询字符串中的整数位置有一定的意义,但是不能在概念模型为查询表达式树的 CriteriaQuery 上下文中使用整数位置。

JPA 查询参数的另一个有趣

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