2011-07-18 111 views
9

我想知道是否可以在Hibernate(3.2)中执行一个以SQLQuery#executeUpdate()调用的分号分隔的SQL更新查询。一次执行多个本地查询

我有一个包含多个更新这样的字符串:

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

我试图做

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

但不断收到以下错误

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 

如果我执行手动的statements的内容我得到没有错误,所以我假设多个半决赛OLon-separated查询在Hibernate或JDBC的某个地方造成麻烦。

单独为每一行分割statements字符串和做createSQLQuery(statement).executeUpdate()是更好吗?

+0

示例代码有点偏离,实际上我计算了一些数值,它们应该没有引号,对不对? – Janne

回答

1

好吧,你必须至少拥抱单引号的X和Y,我会说。

1

你可以做的是使用批处理语句,基本上在执行查询之前调用addBatch(string query);方法,然后当所有查询都在批处理中时,只需调用executeBatch()方法。这将按照您添加批处理的顺序执行它们。

也:在你的语法错误是你需要加上引号'Y''X'

+0

'addBatch()'和'executeBatch'来自'java.sql.Statement',但是海报使用Hibernate。 –

+0

如果我理解正确,他将JDBC称为问题的可能原因(例如抛出的异常属于JDBC连接器),而不像他会接受JDBC中的解决方案。如果JDBC可以接受,Janne可以清除它。 –

+0

Nicolae是对的,这不是我正在寻找的答案。我仍然想使用Hibernate的SQLQuery – Janne

4

另一种方法是使用CASE语句。例如:

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

完美。你救了我的一天!你是英雄:D –