2011-08-30 58 views
22

我試圖執行批量刪除對象,特徵,它與另一個類,FeaturesMetadata一個birdirectional多對一的關係。我有一個SQLGrammerException拋出。Hibernate的異常連接查詢

我使用的HQL:

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

打開顯示SQL,生成如下:

delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=? 

直接運行在SQL數據庫客戶端給出了這樣的例外:

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 

由於生成的SQL被拋出異常,我試圖從MySQL5InnoDBDialect改變方言MySQLInnoDBDialect,但沒有改變。

任何人都可以協助嗎?

+0

確實FeaturesMetaData有FK到功能? – Mindfulgeek

+0

功能對特徵元數據具有FK。 – Jason

回答

34

您可能沒有加入這樣的HQL查詢。從reference documentation報價:

沒有加入,無論是隱性或顯性的,可以在大批量HQL 查詢指定。子查詢可以在WHERE子句,其中 子查詢本身可以包含連接中使用。

所以我想這樣的事情應該工作:

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

Doh!我已經多次閱讀並且仍然沒有點擊。接受答案。 – Jason

+6

您好,我很驚訝它的工作適合你,因爲我越來越:org.hibernate.exception.GenericJDBCException:您不能指定目標表「用戶」在FROM子句更新。發生這種情況的原因是你不能修改你在SELECT部分​​中使用的同一張表格(在你的情況 - 特徵表格中)。 http://dev.mysql.com/doc/refman/5.6/en/update.html: 這種行爲是在記錄。有什麼建議麼? – forhas

+9

哇。我認爲HQL是關於使查詢更簡化和麪向對象比SQL。我不明白爲什麼Hibernate不能自己弄清楚如何在沒有顯式連接的情況下將對象之間的關係轉換爲SQL查詢。 –