Hibernate 如何在JPA/JPQL中过滤集合?
我有两个实体:Hibernate 如何在JPA/JPQL中过滤集合?,hibernate,jpa,jpql,Hibernate,Jpa,Jpql,我有两个实体: @Entity public class Customer implements java.io.Serializable { ... @OneToMany(fetch=FetchType.EAGER, mappedBy="customer") private Set<CustomerOrder> customerOrders; ... @Entity public class CustomerOrder implements java.io.
@Entity
public class Customer implements java.io.Serializable {
...
@OneToMany(fetch=FetchType.EAGER, mappedBy="customer")
private Set<CustomerOrder> customerOrders;
...
@Entity
public class CustomerOrder implements java.io.Serializable {
....
private double cost;
@ManyToOne
@JoinColumn(name="CUST_ID")
public Customer customer;
...
如何在JPQL或Hibernate中实现这一点?发布的查询相当于
select c from Customer c inner join c.customerOrders o where o.cost > 1000
它只返回至少有一个订单且成本大于1000的所有客户
我建议反向连接并选择顺序-它在语义上相同,但在结构上不同于您想要的结果:
select o from CustomerOrder o where o.cost > 1000
现在,Hibernate有一个名为Filter的非JPA特性,它应该完全满足您的需求-请参见此处:
在那里建立一个夫妻关系听起来是个坏主意(从性能上看)
但是为什么这不起作用:从CustomerOrder中选择o,其中o.cost>1000代码>然后从结果列表中提取客户的 试试这个
select c from Customer c join CustomerOrder o with o.cost > 1000
如果客户有两个订单的成本>1000,则可能会返回客户两次,
你可以分组做
select c from Customer c join CustomerOrder o with o.cost > 1000
group by c
jscoot说它返回所有的行,所以您的第一个查询可能并不等同于他的查询,因为C只有一个顺序,而且成本<1000。为什么这是个坏主意?
select c from Customer c join CustomerOrder o with o.cost > 1000
group by c