JPA One To Many关系和表现

时间:2011-11-29 08:03:07

标签: jpa join relational-database lazy-evaluation

我有两个实体:父Customer和子Order 例如,每个Customer都有1,000,000 Orders,因此在任何给定时间内都不需要加载Customer所有Orders,但我希望有这种能力来加入在JPA中查询这两个实体 因此,我必须创建@OneToMany关系来进行连接查询。

我的问题是:如何在不进行joinColumn的情况下获取查询,因为即使在懒惰模式下也可以加载1,000,000个对象!
我只是想在这些对象上查询本地连接等限制。

2 个答案:

答案 0 :(得分:3)

如果您不希望在@OneToMany课程中隐式设置Customer关系而不是您必须的关系。您可以在没有标记关系的情况下执行JPQL查询(以非常精确的方式)。

假设你有:

@Entity
public class Customer {

    // all Customer-related fields WITHOUT @OneToMany relationship with Order
}

@Entity
public class Order {

    @ManyToOne
    private Customer owner;
}

然后,如果你想获得特定Orders的所有Customer,你可以执行一个简单的JPQL查询:

// Customer customer = ...
// EntityManager em = ...

String jpql = "SELECT o FROM Order o WHERE o.owner = :customer";

TypedQuery<Order> query = em.createQuery(jpql, Order.class);
query.setParameter("customer", customer);

List<Order> orders = query.getResultList();

通过这种方式,只有当您确定要获取Customer's订单时,才能执行代码。

我希望我能正确理解你的问题。

答案 1 :(得分:2)

EclipseLink支持QueryKeys,允许您为未映射的查询定义字段或关系。目前没有对查询键的注释支持,但您可以使用API​​和DescriptorCustomizer定义它们。

此外,您不需要OneToMany对其进行查询,只需使用逆ManyToOne进行查询,

Select distinct c from Customer c, Order o where o.customer = c and o.item = :item

或者,

Select distinct o.customer from Order o join o.customer c where o.customer = c and o.item = :item