HQLとの多数の関連付けから一括削除することは可能ですか?
質問
もしそうなら、構文は何ですか?
BarのすべてのインスタンスからFooのインスタンスの関連付けを解除するとします。 SQLでは、次のようになります。
delete from FOO_BAR_MAPPING
where FOO_ID = ?
HQLでは、次のようになります:
delete from Bar.foos foos
where foos.id = :id
(foosはFooのマッピングされたコレクションです)
しかし、間違っているように見えます:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
これはHQLでも可能ですか?
解決
あなたの特定の質問に答えるために、いいえ、私が知る限り、HQLでは不可能です。
ここでは、SQLとHQLを少し混ぜていると思います。 SQLでは、実際に" delete&quot ;;記録、そしてもちろん休止状態も最終的にそれを行います。ただし、Hibernate / HQLはオブジェクト指向の考え方から設計されているため、「削除」は「削除」されます。このコンテキストでは、関連付けではなくオブジェクトを削除しています。通常、次のようなことをします。
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
これは、指定したIDでオブジェクトを取得し、コレクションをクリアすることですべてのBarの関連付けを削除します。これが機能するためには、Foo-Barsアソシエーションを適切な方向にマッピングする必要があります。
他のヒント
HQLでは、関連付けのみを削除することはできません。ただし、できることは次のいずれかです。
A)単一のFooに対して実行しており、カスケードが適切に設定されていると仮定すると、その Foo
インスタンスをロードし、その bars
のコレクションをクリアして保存できますそれ。
B)複数の Foos
から bars
をクリアしようとしている場合、HQLの代わりにSQLクエリをマップできます
所属していません StackOverflow