6

我有两个实体:

@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 中,我想返回那些 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

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

4

3 回答 3

7

发布的查询相当于

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 功能,它应该完全满足您的需求 - 请参见此处: http ://www.hibernate.org/hib_docs/reference/en/html/filters.html

于 2009-03-24T04:23:49.297 回答
2

尝试这个

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
于 2012-11-22T15:25:57.347 回答
0

听起来像一个坏主意(性能方面)在那里有 OneToMany 关系。

但是为什么这不起作用:select o from CustomerOrder o where o.cost > 1000;然后从结果列表中提取客户的?

于 2012-05-23T08:52:57.880 回答