2011-08-30 20 views
22

Sto cercando di eseguire un bulk delete di un oggetto, Feature, che ha una relazione ManyToOne birdirectional con un'altra classe, FeaturesMetadata. Sto facendo gettare un'eccezione SQLGrammerException.Hibernate Exception su MySQL Cross Join Query

L'HQL sto usando:

String hql = "delete from Feature F where F.featuresMetadata.stateGeoId = :stateGeoId"; 

Accensione spettacolo SQL, viene generato il seguente:

delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=? 

L'esecuzione del SQL direttamente nel client db dà questa eccezione:

Poiché SQL generato genera l'eccezione, ho provato a cambiare i dialetti da MySQL5InnoDBDialect a MySQLInnoDBDialect, ma nessun cambiamento.

Qualcuno può aiutare?

+0

fa FeaturesMetaData hanno un FK per caratterizzare? – Mindfulgeek

+0

La funzione ha un FK per le caratteristiche dei metadati. – Jason

risposta

34

Potrebbe non essere possibile accedere a tale query HQL. Citazione dal reference documentation:

No si unisce, sia implicita o esplicita, può essere specificato in una massa di query HQL . Le sottoquery possono essere utilizzate nella clausola where, dove le subquery possono contenere join.

Quindi credo che una cosa del genere dovrebbe funzionare:

delete from Feature F where F.id in 
    (select f2.id from Feature f2 where f2.featuresMetadata.stateGeoId = :stateGeoId) 
+0

Doh! L'ho letto diverse volte e ancora non ho cliccato. Risposta accettata – Jason

+6

Ciao, sono sorpreso che abbia funzionato per te da quando ho ricevuto: org.hibernate.exception.GenericJDBCException: non è possibile specificare la tabella di destinazione "Utenti" per l'aggiornamento nella clausola FROM. Succede dal momento che non puoi modificare la stessa tabella che usi nella parte SELECT (nel tuo caso - la tabella delle caratteristiche). Questo comportamento è documentato su: http://dev.mysql.com/doc/refman/5.6/en/update.html. Eventuali suggerimenti? – forhas

+9

Wow. Pensavo che HQL riguardasse la creazione di query più semplificate e orientate agli oggetti di SQL. Non vedo perché Hibernate non riesca a capire da solo come tradurre la relazione tra gli oggetti in una query SQL senza un join esplicito. –