JPA CriteriaBuilder-按一对多关系中关联实体的数量排序

我有一对多关系中的两个客户实体和订单实体。对于每个客户,我需要计算关联订单的数量,并按此数量对结果进行排序。在本地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中找不到类似的东西。

使用CriteraBuilder组成查询的任何帮助将不胜感激。

先感谢您。

回答:

假设实体客户具有如下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");

}

上面的方法使用Metamodel。如果你不喜欢它,你可以替换Customer_.orders使用"orders",并Customer_.id"id"

如果OneToMany财产是另一种类型的,更换CollectionJoin用正确类型的集合(ListJoinSetJoinMapJoin)。

以上是 JPA CriteriaBuilder-按一对多关系中关联实体的数量排序 的全部内容, 来源链接: utcz.com/qa/427464.html

回到顶部