我有一对多关系中的两个客户实体和订单实体。对于每个客户,我需要计算关联订单的数量,并按此数量对结果进行排序。在本地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
用正确类型的集合(ListJoin
,SetJoin
,MapJoin
)。
关联实体和关联关系属性有什么区别?在我的一本名为《现代数据库管理》(Hoffer,第11版)的书中,作者陈述了两者之间的区别。然而,它并没有真正解释为什么会有差别,相反,它只是给出了它们是如何不同的例子。 据我所知,一个有一个属性关联的关系是一个关联关系属性,并用一条虚线表示一个圆角矩形,该矩形内有该属性。而关联实体是描述关系的多个属性。两者都只能用于ER图解中的多对多关系。我的思维过程正确吗?
我在删除子实体项目时遇到问题。每次我删除它的时候,什么都没有发生,父节点和子节点之间的关联仍然存在。我在网上搜索过,有些人建议使用orphanremoval,但我试过了,没有用。如果任何人可以建议,不胜感激。我的代码如下: 资产实体 (CHILD) 是单向关系,因此资产实体不包含任何@ManyToOne 在我的 SQL 数据库表中,我的关系CLIENTPROFILE_CLIENTASSET,它们通
当我有用户并且他们有其他用户作为朋友时,我想让应用程序类似于facebook。因此,我创建了一个实体
问题内容: 另一个hibernate问题…:P 使用Hibernate的Annotations框架,我有一个实体。每个人都可以有一个朋友的集合:其他的集合。但是,我还无法弄清楚如何在由s 列表组成的类中创建多对多关联(使用用户友好中间表)。 这是User类及其注释: 用户- 朋友映射表只有两列,这两列都是该表列的外键。两列是(应映射到当前用户)和(指定当前用户的朋友的ID)。 问题是,即使我已经预
问题内容: 我有一个使用联接表建模的一对多关系: 这些表应该模拟一个t1与多个t2的关系。使用JPA为这些表建模的正确方法是什么? 问题答案: 一个T1到多个T2的典型表是在T2上有一个指向T1的外键。通常不需要T1_T2表。 这样,JPA结构将是一对多的,可能是双向的。 可能会有一些安排,以使您描述的结构起作用。您可以更改T1_T2: 在T2上添加唯一约束(以便仅允许一个T2) 那真的是你想要的
比如我们有一个用户表,每个用户都可以发布文章,用户和文章就是一对多的关系。 当然imi-demo里一对多的例子选的不好,不过不重要,理解意思就行。 定义 一对多关联会用到的注解: @OneToMany、@JoinFrom、@JoinTo、@AutoSelect、@AutoInsert、@AutoUpdate、@AutoSave、@AutoDelete 如 imi-demo 中代码所示,UserWi