2011-11-29 122 views
2

我有兩個實體:父項Customer和子項Order
例如,每個Customer都有1,000,000個Orders,因此在任何給定時間內都不需要加載Customer與所有Orders,但我希望能夠在JPA中的這兩個實體上進行連接查詢。
因此,我必須創建@OneToMany關係進行連接查詢。JPA OneToMany關係和表現

我的問題是:如何在不使joinColumn的情況下獲得查詢,因爲即使在懶惰模式下也可以加載1,000,000個對象!
我只想獲得這些對象與本地連接限制的查詢。

回答

3

如果您不想在您的Customer類中隱式設置@OneToMany關係,則您不必這樣做。您可以在沒有標記關係的情況下執行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訂單時纔會提供代碼。

我希望我已經正確理解你的問題。

+0

日Thnx,漂亮的答案,但我希望OneToMany有一個限制註釋用於默認提取,您怎麼看?因爲例如我希望我的Customer實體擁有可以通過「customer.orders」訪問的前10個訂單,但是現在,如果我把OnetoMany有可能加載所有1000000條記錄 – Nav

+0

因此,您需要一個註釋/配置,以允許您說出要獲取多少「太多」結果?我猜這樣的功能可能是**高度**供應商特定的,因爲JPA規範甚至不要求提供者尊重延遲加載。我會在你的情況下仔細地放置JOIN。 –

+0

在上面的例子中,是否有可能運行查詢,例如根據基於訂單表的條件從客戶表中檢索數據?例如,我可以說給我所有訂單> 50英鎊的顧客嗎? – ziggy

2

EclipseLink支持QueryKeys,它允許您定義用於查詢未映射的字段或關係。目前沒有註釋支持查詢關鍵字,但您可以使用API​​和DescriptorCustomizer來定義它們。

而且你不需要的一對多在其上進行查詢,只需使用逆多對一查詢,

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