如何在JPA/JPQL中过滤集合?

jsc*_*oot 6 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.Serializable {
....        

    private double cost;

    @ManyToOne
    @JoinColumn(name="CUST_ID")
    public Customer customer;
...
Run Code Online (Sandbox Code Playgroud)

现在在我的JPQL中,我希望以CustomerOrder.cost> 1000返回那些客户.例如,有三个客户A,B和C.A有两个订单,成本分别为1000和2000.B有三个订单,成本分别为2000,3000和500.C有一个成本= 500的订单.现在我想得到三个客户:A只返回成本= 2000的订单; B返回2000和3000的订单; C返回一个空订单集合.

但以下将始终返回完整集合:

select c from Customer c, in(c.customerOrders) o where o.cost>1000
Run Code Online (Sandbox Code Playgroud)

我怎么能在JPQL或Hibernate中做到这一点?

top*_*hef 7

发布的查询相当于

select c from Customer c inner join c.customerOrders o where o.cost > 1000
Run Code Online (Sandbox Code Playgroud)

它只返回至少有一个成本大于1000的订单的所有客户.

我建议反向连接并选择顺序 - 它在语义上是相同的,但在结构上与你想要的结果不同:

select o from CustomerOrder o where o.cost > 1000
Run Code Online (Sandbox Code Playgroud)

现在,Hibernate具有名为Filter的非JPA功能,可以完全满足您的需求 - 请参阅此处:http: //www.hibernate.org/hib_docs/reference/en/html/filters.html