2011-07-18 22 views
9

Me pregunto si es posible ejecutar varias consultas de actualización de SQL separadas por punto y coma con una llamada SQLQuery#executeUpdate() en Hibernate (3.2).Ejecutando múltiples consultas nativas de una vez

tengo cadena que contiene varias actualizaciones de esta manera:

String statements = "UPDATE Foo SET bar=1*30.00 WHERE baz=1; 
        UPDATE Foo SET bar=2*45.50 WHERE baz=2;..."; 

que estoy tratando de hacer

Query query = session.createSQLQuery(statements); 
query.executeUpdate(); 

pero obtengo el siguiente error

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
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 
'UPDATE Foo SET bar=Y WHERE ' at line 3 

Si ejecuto el contenidos del statements a mano no consigo errores, así que estoy asumiendo el múltiplo semic Las consultas separadas por olon están causando problemas en Hibernate o JDBC.

¿Es mejor simplemente dividir la cadena statements y hacer createSQLQuery(statement).executeUpdate() individualmente para cada línea?

+0

El código de ejemplo estaba un poco apagado, en realidad estoy calculando algunas cantidades en la barra, deberían estar bien sin comillas, ¿no? – Janne

Respuesta

1

Bueno, al menos tiene que abrazar X e Y con comillas simples, diría yo.

1

Lo que puede hacer es usar instrucciones de lotes, básicamente antes de ejecutar su consulta llame al método addBatch(string query);, luego, cuando todas sus consultas estén en el lote, simplemente llame al método executeBatch(). Eso los realizará por ti en el orden en que agregaste el mto al lote.

también: el error en la sintaxis es lo que necesita poner entre comillas 'Y' o 'X'

+0

'addBatch()' y 'executeBatch' son de' java.sql.Statement', pero el póster usa Hibernate. –

+0

Si entiendo correctamente, se refirió a JDBC como una causa probable del problema (por ejemplo, la excepción arrojada pertenece al conector JDBC), no como si aceptara una solución en JDBC. Janne podría borrarlo si JDBC es aceptable. –

+0

Nicolae tiene razón, esta no es realmente la respuesta que estoy buscando. Todavía quiero usar SQLQuery de Hibernate – Janne

4

Una alternativa es utilizar una instrucción CASE. Por ejemplo:

UPDATE Foo 
    SET bar = 
    CASE baz 
     WHEN 1 THEN 'X' 
     WHEN 2 THEN 'Y' 
    END CASE 
WHERE baz in (1,2) 
+0

perfecto. me salvaste el dia !!! eres un héroe: D –

Cuestiones relacionadas