È possibile eliminare in blocco da una moltitudine di associazioni con HQL?
Domanda
E se sì, qual è la sintassi?
Supponi di voler non associare un'istanza di Foo a tutte le istanze di Bar: In SQL sarebbe semplicemente:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
In HQL, ho pensato che sarebbe stato qualcosa del genere:
delete from Bar.foos foos
where foos.id = :id
(dove foos è una raccolta mappata di Foo)
Ma sembra essere sbagliato, dando:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
È possibile anche con HQL?
Soluzione
Per rispondere alla tua domanda specifica, no, per quanto ne so non è possibile con HQL.
Penso che stai mescolando un po 'SQL e HQL qui. In SQL, in effetti " elimina " record, e ovviamente anche l'ibernazione alla fine lo farà. Tuttavia Hibernate / HQL è progettato da una mentalità orientata agli oggetti, quindi "elimina" in questo contesto significa che stai eliminando oggetti, non associazioni. In genere dovresti fare qualcosa del tipo:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
Questo recupera l'oggetto tramite l'id specificato e rimuove tutte le associazioni di barre cancellandone la raccolta. Ovviamente devi fare in modo che l'associazione Foo-Bars sia mappata nella giusta direzione perché funzioni.
Altri suggerimenti
La rimozione delle sole associazioni non è possibile con HQL. Quello che puoi fare, comunque, è:
A) Supponendo che tu lo stia facendo per un singolo Foo e che la tua cascata sia impostata in modo appropriato, puoi caricare quell'istanza Foo
, cancellare la sua raccolta di bar
e salvare esso.
B) Se stai cercando di cancellare bar
da più Foos
puoi mappare una query SQL invece di HQL