快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
方面是它们没有内部值。值绑定到可执行查询上下文中的参数。因此,可以合法地从相同的 CriteriaQuery 创建两个独立可执行的查询,并为这些可执行查询的相同参数绑定两个整数值。

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

时间:2011-02-03 IBM Pinaki Poddar

预测结果

您已经看到 CriteriaQuery 在执行时返回的结果已经在 QueryBuilder 构造 CriteriaQuery 时指定。查询的结果被指定为一个或多个预测条件。可以通过两种方式之一在 CriteriaQuery 接口上指定预测条件:

CriteriaQuery<T> select(Selection<? extends T> selection); CriteriaQuery<T> multiselect(Selection<?>... selections);

最简单并且最常用的预测条件是查询候选类。它可以是隐式的,如清单 11 所示:

清单 11. CriteriaQuery 默认选择的候选区段

CriteriaQuery<Account> q = cb.createQuery(Account.class); Root<Account> account = q.from(Account.class); List<Account> accounts = em.createQuery(q).getResultList();

在 清单 11 中,来自 Account 的查询没有显式地指定它的选择条件,并且和显式地选择的候选类一样。清单 12 显示了一个使用显式选择条件的查询:

清单 12. 使用单个显式选择条件的 CriteriaQuery

CriteriaQuery<Account> q = cb.createQuery(Account.class); Root<Account> account = q.from(Account.class); q.select(account); List<Account> accounts = em.createQuery(q).getResultList();

如果查询的预测结果不是候选持久化实体本身,那么可以通过其他几个构造方法来生成查询的结果。这些构造方法包含在 QueryBuilder 接口中,如清单 13 所示:

清单 13. 生成查询结果的方法

<Y> CompoundSelection<Y> construct(Class<Y> result, Selection<?>... terms);    CompoundSelection<Object[]> array(Selection<?>... terms);    CompoundSelection<Tuple> tuple(Selection<?>... terms);

清单 13 中的方法构建了一个由其他几个可选择的表达式组成的预测条件。construct() 方法创建给定类参数的一个实例,并使用来自输入选择条件的值调用一个构造函数。例如,如果 CustomerDetails — 一个非持久化实体 — 有一个接受 String 和 int 参数的构造方法,那么 CriteriaQuery 可以通过从选择的 Customer — 一个持久化实体 — 实例的名称和年龄创建实例,从而返回 CustomerDetails 作为它的结果,如清单 14 所示:

清单 14. 通过 construct() 将查询结果包放入类的实例

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

可以将多个预测条件合并在一起,以组成一个表示 Object[] 或 Tuple 的复合条件。清单 15 显示了如何将结果包装到 Object[] 中:

清单 15. 将结果包装到 Object[]

CriteriaQuery<Object[]> q = cb.createQuery(Object[].class); Root<Customer> c = q.from(Customer.class); q.select(cb.array(c.get(Customer_.name), c.get(Customer_.age)); List<Object[]> result = em.createQuery(q).getResultList();

这个查询返回一个结果列表,它的每个元素都是一个长度为 2 的 Object[],第 0 个数组元素为 Customer 的名称,第 1 个数组元素为 Customer 的年龄。

Tuple 是一个表示一行数据的 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号