HQLとの多数の関連付けから一括削除することは可能ですか?

StackOverflow https://stackoverflow.com/questions/1201690

  •  05-07-2019
  •  | 
  •  

質問

もしそうなら、構文は何ですか?

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クエリをマップできます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top