How to filter collection in JPA/JPQL?

徘徊边缘 提交于 2020-01-01 05:30:12

问题


I have two entities:

@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;
...

Now in my JPQL, I want to return those customers with their CustomerOrder.cost>1000. For example, there are three customers A, B and C. A has two orders with cost=1000 and 2000 respectively. B has three orders with cost=2000,3000 and 500 respectively. C has one order with cost=500. Now i want to get the three customers: A returns the orders with cost=2000 only; B returns the orders with 2000 and 3000; C returns an empty orders collection.

But the following will always return the full collection:

select c from Customer c, in(c.customerOrders) o where o.cost>1000

How can I do that in JPQL or in Hibernate in particular?


回答1:


The query posted is equivalent to

select c from Customer c inner join c.customerOrders o where o.cost > 1000

which simply returns all customers that have at least one order with cost greater than 1000.

I would suggest to inverse join and select orders - it's semantically the same but structurally different from your desired result though:

select o from CustomerOrder o where o.cost > 1000

Now, Hibernate has non-JPA feature called Filter that should accomplish exactly what you are looking for - see here: http://www.hibernate.org/hib_docs/reference/en/html/filters.html




回答2:


Try this

select c from Customer c join CustomerOrder o with o.cost > 1000

It may return a customer twice if he has two orders having cost > 1000, for which you can do group by

select c from Customer c join CustomerOrder o with o.cost > 1000
group by c



回答3:


Sounds like a bad idea (performance-wise) to have OneToMany-relation there.

But why doesn't this work: select o from CustomerOrder o where o.cost > 1000; then from the result list extract the Customer's?



来源:https://stackoverflow.com/questions/675979/how-to-filter-collection-in-jpa-jpql

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!