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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top