我有两个处于一对多关系的实体“客户”和“订单”。
对于每个客户,我需要计算关联订单的数量,并按该数量对结果进行排序。
在本机 postgres 查询中,它看起来像这样:
select cust.id, count(order.id) from customers cust
left outer join orders order
on cust.id = order.customer_id
where .... conditions ...
group by cust.id
order by count desc;
但我必须使用 CriteriaBuilder 来执行此操作,因为此查询是使用 CriteriaBuilder 放入附加条件的较大代码段的一部分。在 Hibernate 中我可能会使用 Projections,但我在 JPA 中找不到类似的东西。
对于使用 CriteriaBuilder 编写查询的任何帮助,我们将不胜感激。
先感谢您。
假设实体 Customer 有一个OneToMany
像这样的属性:
@OneToMany(mappedBy = "customerId")
private Collection<Order> orders;
您可以使用以下查询:
EntityManager em; // to be built or injected
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<Customer> customer = cq.from(Customer.class);
CollectionJoin<Customer, Order> orders = customer.join(Customer_.orders, JoinType.LEFT);
cq.select(cb.tuple(customer, cb.count(orders)));
cq.where(... add some predicates here ...);
cq.groupBy(customer.get(Customer_.id));
cq.orderBy(cb.desc(cb.count(orders)));
List<Tuple> result = em.createQuery(cq).getResultList();
for (Tuple t : result) {
Customer c = (Customer) t.get(0);
Long cnt = (Long) t.get(1);
System.out.println("Customer " + c.getName() + " has " + cnt + " orders");
}
上述方法使用元模型 http://docs.jboss.org/hibernate/jpamodelgen/1.0/reference/en-US/html_single/。如果不喜欢可以更换Customer_.orders
with "orders"
and Customer_.id
with "id"
.
If the OneToMany
属性是另一种类型,替换CollectionJoin
具有正确类型的集合(ListJoin
, SetJoin
, MapJoin
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)