2011-08-30 19 views
22

FeatureMetadataという別のクラスとの間で、ManyToOneという新しい方向性を持つオブジェクト、Featureの一括削除を実行しようとしています。 SQLGrammerExceptionがスローされました。MySQLクロス結合クエリでHibernate例外が発生しました

私が使用しているHQL:

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

は、show SQLに目を向けると、以下が生成されます。

delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=? 

は、DBクライアントに直接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がExceptionをスローしているので、私はMySQL5InnoDBDialectからMySQLInnoDBDialect、ただし変更はありません。

誰でも手助けできますか?

+0

んFeaturesMetaData機能へのFKを持っていますか? – Mindfulgeek

+0

FeatureにFK to FeaturesMetadataがあります。 – 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クエリに変換する方法をHibernateが自明に理解できない理由を理解していません。 –

関連する問題