快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
(Person_.name))); List<Person> result = em.createQuery(c).getResultList(); // start editing List<Order> orders = c.getOrderList(); List<Order> newOrders = new ArrayList<Order>(orders); newOrders.add(cb.desc(p.get(Person_.zipcode))); c.orderBy(newOrders); List<Person> result2 = em.createQuery(c).getResultList(); OpenJPA 中的常驻计算

通过使用 OpenJPA 的扩展特性,清单 21 中的 “在结果中搜索” 例子可以在内存中 计算编辑查询,从而获得更高的效率。这个例子表明编辑查询的结果是原始结果的严格子集。因为 OpenJPA 能够在指定候选集合时从内存计算查询,所以仅需修改 清单 21 的最后一行代码就可以提供原始查询的结果:

List<Person> result2 =   em.createQuery(c).setCandidateCollection(result).getResultList();

在 CriteriaQuery 上的 setter 方法 — select()、where() 或 orderBy() — 使用新的参数替换先前的值。对应的 getter 方法(比如 getOrderList())返回的列表不是活动的,即在返回列表上添加或删除元素不会导致修改 CriteriaQuery;另外,一些供应商甚至返回不可变的列表以阻止意外使用。因此,良好的实践是在添加和删除新的表达式之前,将返回列表复制到一个新的列表中。

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

时间:2011-02-03 IBM Pinaki Poddar

根据例子进行查询

动态查询 API 中的另一个有用特性就是它能够轻松地支持根据例子进行查询。根据例子进行查询(由 IBM? Research 在 1970 年开发出来)通常被作为早期的软件终端用户可用性例子引用。根据例子进行查询的理念使用模板实例,而不是为查询指定精确的谓词。有了给定的模板实例之后,将创建一个联合谓词,其中每个谓词都是模板实例的非 null 和非默认属性值。执行该查询将计算谓词以查找所有与模板实例匹配的实例。根据例子进行查询曾考虑添加到 JPA 2.0 中,但最终没有添加。OpenJPA 通过它的扩展 OpenJPAQueryBuilder 接口支持这种查询,如清单 22 所示:

清单 22. 使用 OpenJPA 的 CriteriaQuery 根据例子进行查询

CriteriaQuery<Employee> q = cb.createQuery(Employee.class); Employee example = new Employee(); example.setSalary(10000); example.setRating(1); q.where(cb.qbe(q.from(Employee.class), example);

如这个例子所示,OpenJPA 的 QueryBuilder 接口扩展支持以下表达式:

public <T> Predicate qbe(From<?, T> from, T template);

这个表达式根据给定模板实例的属性值生成一个联合谓词。例如,这个查询将查询所有薪水为 10000 评级为 1 的 Employee。要进一步控制比较,可以指定不用于比较的可选属性,以及为值为 String 的属性指定比较方式。

结束语

本文介绍了 JPA 2.0 中的新 Criteria API,它是一个用 Java 语言开发动态、类型安全的查询的机制。CriteriaQuery 在运行时被构建为一个强类型查询表达式树,本文通过一系列例子展示了它的用法。

本文还确立了 Metamodel API 的关键角色,并展示了实例化元模型类如何使编译器能够检查查询的正确性,从而避免语法有误的 JPQL 查询引起的运行时错误。除了保证语法正确之外,JPA 2.0 以编程的方式构造查询的特性还能通过数据库函数实现更多强大的用途,比如通过例子进行查询。我希望本文的读者能够发现这些强大的新 API 的其他新用途。

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