2013-04-08 49 views
0

當收集元素具有自己的集合時,它看起來像基本查詢不起作用。查詢具有嵌套集合的實體的正確方法?

想象一下銀行的客戶數據模型,客戶擁有投資組合。什麼是獲得客戶的正確方式?

我嘗試這樣做:

@Query("SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.portfolios") 

但它失敗,「無法懶洋洋地初始化角色的集合」。

投資的定義是:

@ManyToMany(cascade = CascadeType.ALL) 

查詢將工作,如果我改變fecthType:

@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 

但是,有沒有辦法讓它不改變fetchtype工作?

編輯:

我要指出,我用Spring的JpaRepository定義上面的查詢。所有實體都有它們各自的存儲庫,但它看起來像提取客戶不會觸及Portfolios存儲庫中的任何方法(這會左擊加入投資),因此投資永遠不會被提取。

此外,我可以使用類似的查詢獲取投資組合,並且它可以正常工作,因爲投資沒有任何集合。但是提取連鎖客戶 - >投資組合 - >投資失敗。

+2

這會幫助你:http://stackoverflow.com/questions/5404599/failed-to -lazily-initialize-a-collection-of-role – DessDess 2013-04-08 09:03:22

+0

我還是不明白它爲什麼適用於具有集合的實體,但不適用於具有集合的集合的實體... – wannabeartist 2013-04-08 10:40:20

+0

只是一個問題,帶有ManyToOne映射仍然得到錯誤? – DessDess 2013-04-08 12:23:26

回答

1

您的查詢使用left join fetch選擇客戶並提取其投資組合。如果你也想獲取投資組合的invstments,你需要一個額外的連接抓取,就像SQL:

select distinct c FROM Customer c 
left join fetch c.portfolios portfolio 
left join fetch portfolio.investments 
+0

您是否有任何線索知道爲什麼會拋出異常?我會理解,爲什麼他如果嘗試訪問投資時會得到這個例外,因爲他們沒有初始化,但在這裏他不想獲取投資,爲什麼它會失敗?我可能會完全錯誤... – DessDess 2013-04-08 13:49:46

+0

謝謝,這是有效的。但如果我不需要他們呢?我如何告訴hibernate/jpa忽略投資,只有客戶和投資組合? – wannabeartist 2013-04-08 13:50:48

+1

如果您遇到此異常,則表示您正在訪問投資集合。如果你不需要它們,那麼在你的問題中執行查詢,而不用'left join fetch portfolio.investments'。你得到的例外恰恰說明投資沒有被加載。 – 2013-04-08 13:56:08