您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

其他 2022/1/1 18:21:53 有396人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶