2011-08-30 13 views
22

Próbuję wykonać zbiorcze usunięcie obiektu, elementu, który ma kierunkowe powiązanie ManyToOne z inną klasą, FeatureMetadata. Mam zgłoszony wyjątek SQLGrammerException.Wyjątek hibernacji w zapytaniu krzyżowym MySQL

HQL Używam:

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

Włączanie pokazu SQL generowany jest następujący:

delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=? 

Uruchamianie SQL bezpośrednio w kliencie db daje ten wyjątek:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cross join FEATURESMETADATA featuresme1_ where stategeoid='01'' at line 1 

Ponieważ wygenerowany kod SQL rzuca wyjątek, próbowałem zmienić dialekty z MySQL5InnoDBDialect na MySQLInnoDBDialect, ale bez zmian.

Czy ktoś może pomóc?

+0

Does FeaturesMetaData mają FK do funkcji? – Mindfulgeek

+0

Funkcja ma FK do FeaturesMetadata. – Jason

Odpowiedz

34

Możesz nie mieć złączeń w takim zapytaniu HQL. Cytat z reference documentation:

Nie łączy, zarówno bezpośrednia lub pośrednia, mogą być określone w masie HQL zapytania. Zapytania dodatkowe mogą być używane w klauzuli where, gdzie same podkwerendy mogą zawierać sprzężenia.

Więc myślę, że coś jak to powinno działać:

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

Doh! Czytałem to kilka razy i nadal nie klikałem. Odpowiedź została zaakceptowana. – Jason

+6

Witam, jestem zaskoczony, że zadziałało, ponieważ dostaję: org.hibernate.exception.GenericJDBCException: Nie można określić tabeli docelowej "Użytkownicy" dla aktualizacji w klauzuli FROM. Dzieje się tak, ponieważ nie można modyfikować tej samej tabeli, której używasz w części SELECT (w twoim przypadku - w tabeli funkcji). To zachowanie jest udokumentowane na stronie: http://dev.mysql.com/doc/refman/5.6/en/update.html. Jakieś sugestie? – forhas

+9

Wow. Myślałem, że HQL polega na uproszczeniu zapytań i zorientowaniu obiektowym na SQL. Nie widzę powodu, dla którego Hibernate nie może samodzielnie objaśnić, w jaki sposób tłumaczyć relacje między obiektami w zapytanie SQL bez wyraźnego sprzężenia. –

Powiązane problemy