2011-09-12 91 views
2

我有一個訂單實體(即,表示訂單),並且每個訂單都有一組DeliveryDates。 我試圖實現一個搜索功能,並在JFace TableViewer中顯示結果。具有一對多關聯的休眠條件

我希望對於每個具有多個交貨日期的訂單,它應該在表中進行復制,但DeliveryDate列將顯示此實例的特定交貨日期。

這個查詢很容易在SQL中用一個簡單的連接完成,並且每行的行重複的日期都不同。 由於我正在執行搜索功能,因此我正在逐步構建查詢(取決於用戶選擇的搜索參數),因此使用Criteria構建查詢非常有用。問題是,我得到的結果列表是重複的(這是OK),但每個實體只包含相同的一組DeliveryDates - 所以我無法爲同一Order的不同行打印不同的日期。

有沒有辦法使用Critera來做到這一點?如果不是,我該怎麼辦?

編輯:編輯:例如,這個HQL查詢似乎做同樣的事情: 「從訂單選擇dd.deliveryDate,OD爲OD左連接od.deliveryDates DD」

: 我已經找到了解決辦法:

Criteria crit = session.createCriteria(Order.class) 
      .createAlias("deliveryDates", "dd") 
      .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);  

我給deliveryDates收集的別名,用於使用ResultTransformer爲了在地圖返回結果。搜索結果列表將包含具有兩個鍵「this」(又名Criteria.ROOT_ALIAS)和「dd」的地圖。這將使我行的重複,我想,現在我可以抓住這樣相應的對象:

 Map map = (Map) element; 
     Order ord = (Order) map.get(Criteria.ROOT_ALIAS); 
     DeliveryDate dd = (DeliveryDate) map.get("dd"); 

回答

0

的重複條目的原因(有相同的數據)是生成的行(重複的)有相同的主關鍵字&在休眠狀態下的處理方式相同。

作爲一種解決方案,您需要確保每個條目的PK計算方式不同(嘗試在此處使用投影)。

也HQL可能是一個更容易的選擇(我通常喜歡這種情況下的HQL)。

更好的解決方案: 如果你能查詢(至少它的一部分)轉換成視圖&獲取數據從它那麼大部分的問題都將迎刃而解&這將是一個更好的設計。

+0

感謝您的回覆。我可以在HQL中做類似的事情,例如:「select dd.deliveryDate,od from order as od join join od.deliveryDates dd」。這似乎會返回重複項(如我所願),並且對於每一行deliveryDate都是不同的。問題是我正在做一個搜索窗口,用戶可以自由選擇搜索參數,並且使用Criteria可以更容易地構建查詢(所以我不會過濾他沒有問過的列對於)。所以基本上,我希望Criteria查詢返回的不僅僅是Order對象,我希望每個重複的Order都有不同的日期。 – Caleb

+0

我明白.. HQL是一個建議(並不是說標準不能完成這項工作)..重複條目的問題的原因是主鍵..請做點什麼。 –

+0

感謝您的幫助,我找到了解決方案(我編輯了我的原始文章以顯示它)。 – Caleb

0

one to many方案中實現所需內容的另一種方法是在關係的「多」端建立標準。

Criteria crit = session.createCriteria(DeliveryDate.class); 
... 

DeliveryDate dd = (DeliveryDate) element; 
Order ord = dd.getOrder();