Est-il possible de supprimer en bloc une association multiple avec HQL?
Question
Et si oui, quelle est la syntaxe?
Supposons que je souhaite qu'une instance de Foo soit dissociée de toutes les instances de Bar: En SQL, ce serait simplement:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
Dans HQL, j'ai supposé que ce serait quelque chose comme:
delete from Bar.foos foos
where foos.id = :id
(où foos est une collection cartographiée de Foo)
Mais semble être faux, donnant:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
Est-ce même possible avec HQL?
La solution
Pour répondre à votre question précise, non, pour autant que je sache, ce n'est pas possible avec HQL.
Je pense que vous mélangez un peu SQL et HQL ici. En SQL, vous avez bien besoin de "supprimer" records, et bien sûr, hibernate finira par le faire aussi. Cependant, Hibernate / HQL est conçu à partir d'un état d'esprit orienté objet, donc "supprimer". dans ce contexte signifie que vous supprimez des objets, pas des associations. Généralement, vous feriez quelque chose comme suit:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
Ceci récupère l'objet par l'id que vous avez spécifié et supprime toutes les associations de barres en effaçant sa collection. Bien évidemment, l'association Foo-Bars doit être cartographiée dans la bonne direction pour que cela fonctionne.
Autres conseils
Supprimer des associations seules n’est pas possible avec HQL. Ce que vous pouvez faire, cependant, est soit:
A) En supposant que vous le fassiez pour un seul Foo et que votre cascade soit configurée correctement, vous pouvez charger cette instance Foo
, effacer sa collection de barres
et enregistrer. il.
B) Si vous essayez de supprimer les barres
de plusieurs Foos
, vous pouvez mapper une requête SQL au lieu de HQL