2011-10-15 16 views
1

我很困惑如何查詢其中包含子對象的對象列表。如何將簡單的Hibernate連接結果映射到帶有子對象的對象?

我有兩個類Execution和Order。並在執行,我在它的訂單對象爲一比一的關係:

public class Execution { 
    private long id; 
    private Order order; 
    ... 

在Execution.hbm.xml,我已經配置順序爲多到一個具有獨特=」真正」。

<class name="Execution" table="executions"> 
    <id name="executionId" type="long"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Order" unique="true" fetch="join" class="Order" /> 
</class> 

通常情況下,我們查詢與HibernateDaoSupport的執行對象使用:

List<Execution> executions = getHibernateTemplate().find("from Execution"); 

通過上述關係,我們怎麼查詢它和我在哪裏可以找到關於持久對象的複雜連接的更多信息?我已經試過:

List<Execution> list = getHibernateTemplate().find("from Execution e left outer join e.order"); 

但它給一個ClassCastException作爲查詢似乎並不與在執行訂單對象的額外訂單詳細信息返回執行對象。

映射有問題嗎?或者查詢?

非常感謝您的指點!

- 更新

對不起,我是一個菜鳥。顯然第一個查詢的作品。在閱讀了大量有關HQL的文檔後,他們對此並不清楚。任何更好的文檔都會有所幫助。謝謝...

回答

3

這是行不通的,因爲你沒有明確告訴你只需要結果中的執行實體。它無法弄清楚,因爲加入到訂單實體原因也訂單屬性成爲結果的一部分。

List<Execution> list = getHibernateTemplate().find(
    "from Execution e left outer join e.order"); 

只需加選擇,它會很好地工作:

List<Execution> list = getHibernateTemplate().find(
    "select e from Execution e left outer join e.order"); 

但是否有意義有一個這樣的查詢等問題,一般不必進行連接的查詢有關係屬性填充。他們是否通過設置獲取策略LAZY/EAGER或取決於默認值來控制它們。

在你的情況才能在查詢應該只存在如果

  1. 要限制某些屬性,以便(查詢的結果,在這樣也能避免加入您的HQL查詢,只是導航通過的情況下,路徑:e.order.id = 2)或
  2. 訂購關係是懶惰,你只是想確保秩序 被取出。

    名單列表= getHibernateTemplate()找到( 「從執行e離開外部聯合獲取e。令「);

+0

缺少什麼來自OP的查詢是fetch關鍵字:left outer join ** fetch ** e.order。沒有它,左外連接沒有任何用處 –

+0

好點,加上回答,但看起來像在他的情況下只是「從執行「就足夠了。 –

+0

我不清楚他是否想加載子對象。 +1爲您的答案。 –

0

@米克的和@ JB的答案/評論是正確的。要查詢的子對象上只是改變了線

List<Execution> list = getHibernateTemplate().find(
"select e from Execution e left outer join e.order"); 

List<Execution> list = getHibernateTemplate().find(
"select e from Execution e left outer join e.order as o where o.id = ?"); 
+0

我得到一個「org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話」時我嘗試訪問訂單的變量。那是什麼意思? – April

相關問題