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