2011-11-24 74 views
8

我有一個單向一對多關係的類別如下:休眠 - HQL來從單向一對多關係的集合

public class Order { 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="order_item", joinColumns={@JoinColumn(name="order_id")}, inverseJoinColumns={@JoinColumn(name="item_id")}) 
    public Set<Item> getItems() { 
     return items; 
    } 
} 

通常得到這個訂單的內容很簡單:

List<Item> items = order.getItems(); 

但無論出於何種原因,我可能希望以某種方式過濾我的結果,並以最快的方式檢索僅某個項目集合的一部分,例如所有商品超過特定價格,低於特定庫存等(不返回全部然後過濾)。爲此,我將運行HQL查詢以檢索特定訂單的項目,並將更多內容添加到我的where子句或我的查詢對象中。

憑直覺我想這種行爲(這是完全錯誤的):

SELECT jointable.ITEM from order_item as jointable inner join jointable.order where order = :order 

但是,當然,這是錯誤的,因爲HQL工作在映射實體方面,所以我不能在查詢中使用的連接表。那麼做到這一點的正確方法是什麼?

編輯:

我發現這個問題,我想下面的查詢答案:

Select o.items from Order o where o = ? 

這讓我去取物品訂單的集合,而不必使用雙向關係。我現在可是對這個問題的第二階段,這是如何篩選這個集合的結果混爲一談,最簡單的例子是:

Select o.items from Order o where o = ? order by o.items.somenumberfield asc 

它返回非法企圖取消引用集合,那麼我將如何過濾我的物品?

編輯:

票證解決方案實際上是正確的,我本來誤解了解決方案。

回答

6
select item from Order order 
inner join order.items item 
where order = :order 
and ... 

HQL查詢使用實體及其關聯。關聯使用連接表的事實對於HQL並不重要:您可以通過關聯進行導航,並且Hibernate會對SQL進行適當的轉換。

+0

感謝您的幫助,請參閱我的編輯 – mogronalol

3

這聽起來像你想映射這種關係的另一方,即使這種雙向映射。

然後你可以用訂單號在你的HQL:

from Item as item where item.amount > :amount and item.order.id = :orderId 

從HQL documentation

從貓的貓在那裏cat.mate.id = 69 的查詢是有效的並且不需要表連接。

你試圖做這個查詢的事實表明一條線和它的順序之間的關係是重要的!

+1

無需使關聯成爲雙向。看到我的答案。 –

+0

你不需要。這並不意味着你不應該這樣做。 Hibernate文檔解釋了這個實例的HQL針對已經映射雙方的情況進行了優化。 –

+0

感謝您的幫助,請參閱我的編輯 – mogronalol