Ist es möglich, bulk löschen von einem viel viele Vereinigung mit HQL?
Frage
Und wenn ja, was ist die Syntax?
Nehmen wir an, ich eine Instanz von Foo wollen von allen Instanzen der Bar unassociated sein: In SQL wäre es einfach sein:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
In HQL nahm ich an, es wäre so etwas wie:
delete from Bar.foos foos
where foos.id = :id
(wobei foos eine kartiert Sammlung von Foo)
Aber scheint falsch zu sein, geben:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
Ist dies überhaupt möglich mit HQL?
Lösung
Um Ihre Frage zu beantworten, nein, soweit ich weiß, es ist nicht möglich, mit HQL.
Ich glaube, Sie SQL und HQL ein wenig hier abmischen. In SQL, „Löschen“ Sie tatsächlich Aufzeichnungen und natürlich Hibernate tun wird letztlich das auch. Jedoch Hibernate / HQL wird von einer objektorientierten Mentalität entwickelt, so „löschen“ in diesem Zusammenhang bedeutet, dass Sie Objekte löschen, nicht Assoziationen. Typischerweise etwas tun Sie möchten, dass folgt:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
Dies ruft das Objekt durch die id Sie angegeben, und entfernt alle Bar Verbände durch seine Sammlung zu löschen. Natürlich müssen Sie den Foo-Bars Verein in der richtigen Richtung für diese abgebildet arbeiten müssen.
Andere Tipps
Verbände allein Entfernen ist nicht möglich, mit HQL. Was Sie tun können, ist jedoch entweder:
A) Angenommen, Sie es für eine einzelne Foo tun und Ihre Kaskade entsprechend eingestellt ist, können Sie dieses Foo
Beispiel klar seine Sammlung von bars
laden und speichern.
B) Wenn Sie versuchen, bars
von mehreren Foos
löschen können Sie eine SQL-Abfrage statt HQL Karte