快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
口。从概念上看,Tuple 是一个 TupleElement 列表 — 其中 TupleElement 是源自单元和所有查询表达式的根。包含在 Tuple 中的值可以被基于 0 的整数索引访问(类似于熟悉的 JDBC 结果),也可以被 TupleElement 的别名访问,或直接通过 TupleElement 访问。清单 16 显示了如何将结果包装到 Tuple 中:

清单 16. 将查询结果包装到 Tuple

CriteriaQuery<Tuple> q = cb.createTupleQuery(); Root<Customer> c = q.from(Customer.class); TupleElement<String> tname = c.get(Customer_.name).alias("name"); q.select(cb.tuple(tname, c.get(Customer_.age).alias("age"); List<Tuple> result = em.createQuery(q).getResultList(); String name = result.get(0).get(name); String age = result.get(0).get(1);

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

时间:2011-02-03 IBM Pinaki Poddar

嵌套限制

从理论上讲,可以通过嵌套 Tuple 等条件(它的元素本身为 Object[] 或 Tuple)来构成复杂的结果。不过,JPA 2.0 规范禁止此类嵌套。multiselect() 的输入条件不能是数组或值为二元组的复合条件。允许作为 multiselect() 参数的唯一复合条件由 construct() 方法创建(该方法仅表示一个元素)。

不过,OpenJPA 没有限制在一个复合选择条件中嵌套其他的复合选择条件。

这个查询返回一个结果列表,它的每个元素都是一个 Tuple。反过来,每个二元组都带有两个元素 — 可以被每个 TupleElement 的索引或别名(如果有的话)访问,或直接被 TupleElement 访问。清单 16 中需要注意的两点是 alias() 的使用,它是将一个名称绑定到查询表达式的一种方式(创建一个新的副本),和 QueryBuilder 上的 createTupleQuery() 方法,它仅是 createQuery(Tuple.class) 的代替物。

这些能够改变结果的方法的行为和在构造期间被指定为 CriteriaQuery 的类型参数结果共同组成 multiselect() 方法的语义。这个方法根据最终实现结果的 CriteriaQuery 的结果类型解释它的输入条件。要像 清单 14 一样使用 multiselect() 构造 CustomerDetails 实例,您需要将 CriteriaQuery 的类型指定为 CustomerDetails,然后使用将组成 CustomerDetails 构造方法的条件调用 multiselect(),如清单 17 所示:

清单 17. 基于结果类型的 multiselect() 解释条件

CriteriaQuery<CustomerDetails> q = cb.createQuery(CustomerDetails.class); Root<Customer> c = q.from(Customer.class); q.multiselect(c.get(Customer_.name), c.get(Customer_.age));

因为查询结果类型为 CustomerDetails,multiselect() 将其预测条件解释为 CustomerDetails 构造方法参数。如将查询指定为返回 Tuple,那么带有相同参数的 multiselect() 方法将创建 Tuple 实例,如清单 18 所示:

清单 18. 使用 multiselect() 方法创建 Tuple 实例

CriteriaQuery<Tuple> q = cb.createTupleQuery(); Root<Customer> c = q.from(Customer.class); q.multiselect(c.get(Customer_.name), c.get(Customer_.age));

如果以 Object 作为结果类型或没有指定类型参数时,multiselect() 的行为会变得更加有趣。在这些情况中,如果 multiselect() 使用单个输入条件,那么返回值将为所选择的条件。但是如果 multiselect() 包含多个输入条件,结果将得到一个 Object[]。

高级特性

到目前为止,我主要强调了 Criteria API 的强类型,以及它如何帮助减少出现在基于字符串 JPQL 查询中的语义错误。Criteria API 还是以编程的方式构建查询的机制,因此通常被称为动态 查询 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号