2011-08-30 15 views
22

Estoy tratando de realizar una eliminación masiva de un objeto, Feature, que tiene una relación ManyToOne birdirectional con otra clase, FeaturesMetadata. Tengo una SQLGrammerException lanzada.Hibernate Excepción en MySQL Cross Join Query

El HQL que estoy usando:

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

Volviendo en el programa de SQL, se genera el siguiente:

delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=? 

Ejecutar el SQL directamente en el cliente db da esta excepción:

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 

Dado que el SQL generado arroja la excepción, intenté cambiar los dialectos de MySQL5InnoDBDialect a MySQLInnoDBDialect, pero sin cambios.

¿Alguien puede ayudar?

+0

¿El FeaturesMetaData tiene una FK función? – Mindfulgeek

+0

La característica tiene un FK a FeaturesMetadata. – Jason

Respuesta

34

Es posible que no tenga uniones en dicha consulta HQL. Presupuesto de la reference documentation:

No se une, ya sea implícita o explícita, se puede especificar en una mayor consulta HQL . Las subconsultas se pueden usar en la cláusula where, donde las subconsultas pueden contener uniones.

Así que supongo que algo como esto debería funcionar:

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

Doh! Lo he leído varias veces y todavía no he hecho clic. Respuesta aceptada – Jason

+6

Hola, me sorprende que funcionó para usted ya que estoy obteniendo: org.hibernate.exception.GenericJDBCException: no puede especificar la tabla de destino 'Usuarios' para la actualización en la cláusula FROM. Sucede ya que no puede modificar la misma tabla que utiliza en la parte SELECCIONAR (en su caso, la tabla de características). Este comportamiento está documentado en: http://dev.mysql.com/doc/refman/5.6/en/update.html. ¿Alguna sugerencia? – forhas

+9

Wow. Pensé que HQL tenía que ver con hacer consultas más simplificadas y orientadas a objetos que SQL. No veo por qué Hibernate no puede entender por sí solo cómo traducir la relación entre los objetos en una consulta SQL sin una unión explícita. –