2014-11-14 30 views
1

這不是一個技術問題,只是一種語法修正,我沒有得到。如何在Hibernate查詢語言中使用提取

我有休眠3.6,我已經在xml文件中映射了我的模型類。這些XML文件中提到的默認類型是這些類將被帶入懶惰。由於它的硬編碼,我無法改變這種行爲。

我試圖帶來的模型看起來像這樣。

class A { 
    private int id; 
    private B b; 
    private C c; 
} 

B類和C類需要在我的情況下急切地加載。

所以我寫了這樣的查詢。

from A.class.getName() a where a.id = :id; 

在這個查詢中,我在哪裏放置fetch關鍵字。 下面一個拋出錯誤:

from A.class.getName a fetch where a.id = :id; 

在互聯網上的例子,他們正在做一些連接的查詢,然後得到一些價值觀是這樣的:

from Cat as cat inner join fetch cat.mate left join fetch cat.kittens 

然而,在我的情況,所有的連接是在xml文件內部完成的。我不必在查詢中進行連接。那麼我在哪裏放置「fetch」關鍵字來聲明同時啓動所有鏈接類(B和C)也是非懶惰的。

注:

  1. 我不能使用標準的API,因爲我不想在我的項目中添加額外的罐子。
+0

你的意思是「所有連接都是在xml文件內部完成的」?爲什麼你不能使用類似網上樣本的東西? '從A內部聯接獲取a.b爲b,其中a.id =:id' – 2014-11-15 01:05:25

+0

在我的xml文件中,我已經定義了一對多和多對多的關係。那麼爲什麼我需要顯式加入hql?我只想使用hql查詢來告訴它獲取所有關聯的類,而不是再次連接。我對麼? – Rash 2014-11-15 01:53:11

+0

'fetch'用於覆蓋關係的'lazy-eager'行爲。如果你有'b'作爲'lazy'加載關聯,你可以使用fetch來強制hibernate加載'b'。如果'b'是'eager'加載的,則不需要'fetch'。 – 2014-11-15 02:05:59

回答

5

的語法是

select a from A a 
left join fetch a.b 
left join fetch a.c 
where a.id = :id 

the documentation相關部分:使用單個選擇

A「取」加入允許值的關聯或集合與它們的父對象一起被初始化。這在收集的情況下特別有用。它有效地覆蓋了關聯和集合映射文件的外連接和惰性聲明。有關更多信息,請參見Section 20.1,「獲取策略」。

from Cat as cat 
inner join fetch cat.mate 
left join fetch cat.kittens 
+0

好吧..我明白了。所以如果我只想初始化B類,我會寫如下查詢:從A.class.getName()獲得一個左連接獲取ab,其中a.id =:id和這種方式在A類中,只有B會渴望,但C仍然是懶惰?正確? – Rash 2014-11-15 13:57:23

+0

是的,這是正確的。 – 2014-11-15 13:57:51

+0

嗨。只是爲了解答您的答案 - 我找到了更多解決方案並將其發佈到此處。你覺得它是正確的嗎? – Rash 2014-11-17 16:41:12

1

還有一個答案,我發現,並且是非常有趣的。

如果您願意編寫本機SQL查詢,則可以在hiberate中使用addJoin()方法。 「16.1.3處理關聯和集合」在文檔here,下段,

的例子是:

sess.createSQLQuery("SELECT c.ID, NAME, BIRTHDATE, DOG_ID, D_ID, D_NAME FROM CATS c, DOGS d WHERE c.DOG_ID = d.D_ID") 
.addEntity("cat", Cat.class) 
.addJoin("cat.dog"); 

It is possible to eagerly join in the Dog to avoid the possible extra roundtrip for initializing the proxy. This is done via the addJoin() method, which allows you to join in an association or collection. 

所以,你可以很容易地熱切加載所有關聯的類這樣的。

相關問題