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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top