2010-09-10 35 views
3

我試圖找出如何渴望負載客戶在以下HQL查詢:我可以使用HQL加載屬性嗎?

select order.Customer 
from Order as order 
where order.Id in 
(
    select itemId 
    from BadItem as badItem 
    where (badItemType = :itemType) and (badItem.Date >= :yesterday) 
) 

有訂單和客戶之間平時多到一的關係。

我想如果可能的話做,這是在查詢,而不是映射, - 如在「連接抓取......」

也許查詢將被重構的加入和我有一個心理障礙。

任何想法?

回答

5
select customer 
from BadItem as badItem 
join fetch badItem.Order as order 
left join fetch order.Customer as customer 
where (badItemType = :itemType) and (badItem.Date >= :yesterday) 

對於這個工作,你將需要添加BadItem與秩序之間的關係,如果BadItem是不相關的訂單,或使用額外條件的inner join(注意性能使用替代2時)。

備選:

select customer 
from Order as order 
join fetch order.Customer as customer 
where order.Id in 
(
    select itemId 
    from BadItem as badItem 
    where (badItemType = :itemType) and (badItem.Date >= :yesterday) 
) 

編輯:

什麼:

select customer 
from Order as order 
join fetch order.Customer customer 
join fetch customer.orders 
where order.Id in 
(
    select itemId 
    from BadItem as badItem 
    where (badItemType = :itemType) and (badItem.Date >= :yesterday) 
) 
+0

感謝您的幫助。我首先嚐試了「替代」查詢,但得到了「查詢指定的連接提取,但獲取的關聯的所有者未出現在選擇列表中」錯誤。有任何想法嗎?一旦我可以計算出如何映射BadItem和Order(BadItems表中的鍵實際上是三列 - 不是我的設計),我會嘗試給你第一個建議。 – dommer 2010-09-10 12:45:21

+0

嗯,聽起來像是因爲如果你選擇了顧客,他們已經被填充了。所以這基本上意味着你的問題是沒有意義的;如果直接選擇客戶,客戶不能被延遲加載(hibernate不支持屬性級的延遲加載),因此已經加載。這可能嗎? – 2010-09-10 12:55:29

+0

有人會這樣想,但我原來的查詢拋出了Customer._orders的LazyInitializationException(_orders是Order屬性的後臺字段)。 – dommer 2010-09-10 13:08:26

相關問題