2

次の 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 の間のすべての関連付けを1 つのステートメントで切断することです。各 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 に設定できないことは明らかです。しかし、ここにいる誰かが回避策を知っているのではないでしょうか?

4

2 に答える 2

0

コレクションで clear を実行すると、すべての関係が削除されます。HQL ではこれを行うことはできませんが、session.get を使用するとパフォーマンスが向上します。この投稿を参照してください

于 2012-09-18T12:05:22.970 に答える
0

JPQL の update および delete クエリは、単一のエンティティ クラスのエンティティにのみ適用されるため、達成しようとしていることが不可能です。ただし、user1495181 が提案したように、コレクションで clear を呼び出すことができます。トランザクションの最後にエンティティ マネージャーがフラッシュされると、すべてのリンク更新 (ここではリンクが削除されます) ステートメントが準備済みステートメント バッチに追加され、データベースに送信されます。

于 2012-09-18T12:51:36.837 に答える