2012-09-18 27 views
1

考慮以下JPQL查詢:如何清除JPQL中的集合關聯?

UPATE FOO f SET f.bars = NULL 

運行此語句將產生異常:

java.lang.IllegalArgumentException: org.hibernate.QueryException: collections not assignable in update statements [UPATE FOO f SET f.bars = NULL ] 

我試圖做的是在一個聲明之間的所有協會斷絕FOO和BAR。而不是迭代每個FOO以將條集合設置爲null。這要快得多。

不幸的是,該關聯是單向的 - 因此Bar實體中沒有foo屬性。因此JPQL可以清除協會的另一端。

調用new無法正常工作或:

UPATE FOO f SET f.bars = NEW java.util.ArrayList() 

這導致了不同的異常:

java.lang.IllegalArgumentException: node to traverse cannot be null! 

很明顯JPA/Hibernate不會允許收藏協會被設置爲null。但也許有人在這裏知道解決方法?

回答

0

在集合上運行清除假設刪除所有關係。 你不能在HQL中做到這一點,但使用session.get將有助於提高性能。 看到這個post

+0

沒錯。但爲了表現,我試圖在一個JPQL語句中這樣做。 –

+0

更新我的回答 –

0

JPQL更新和刪除查詢僅適用於單個實體類的實體,所以你試圖實現的是不可能的。然而,如user1495181建議你可以打電話清除收集。當實體管理器在事務結束時刷新時,所有鏈接更新(這裏是鏈接被刪除)語句將被添加到準備好的語句批處理併發送到數據庫。

+0

有沒有什麼特別的原因是不可能的? –