一次执行多个本地查询

15

我想知道在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中的内容,就不会出错,因此我认为多个被分号分隔的查询在Hibernate或JDBC中可能会出现问题。是否最好只需拆分statements字符串,并为每行执行createSQLQuery(statement).executeUpdate()

示例代码有点偏差,实际上我正在计算一些金额到柱状图,它们应该没有引号也可以正常工作,对吗? - Janne
3个回答

6
一种替代方案是使用CASE语句。例如:
UPDATE Foo
    SET bar = 
    CASE baz
       WHEN 1 THEN 'X'
       WHEN 2 THEN 'Y'
    END CASE
WHERE baz in (1,2)

2
你可以使用批处理语句,即在执行查询之前调用addBatch(string query);方法,然后当所有查询都在批处理中时,只需调用executeBatch()方法即可。这将按照您添加到批处理中的顺序为您执行所有查询。
此外:您语法上的错误是需要在'Y''X'中加上引号。

1
addBatch()executeBatch() 来自 java.sql.Statement,但是海报使用了 Hibernate。 - Nicolae Albu
如果我理解正确的话,他提到JDBC可能是问题的原因(例如,抛出的异常属于JDBC连接器),而不是他会接受在JDBC中找到解决方案。如果JDBC可行,Janne可以澄清一下。 - Nicolae Albu
Nicolae是正确的,这并不是我要找的答案。我仍然想使用Hibernate的SQLQuery。 - Janne
1
@Janne,很抱歉,我想我没有像我想的那样仔细阅读问题,但是如果您正在使用JDBC,这仍然是一个不错的解决方案,所以我不会将其删除,因为其他人可以从中学习。此外,这是一个可行的解决方案。 - RMT
@Janne,我正在研究 HIBERNATE API,发现其中有与我之前建议的批处理非常相似的内容。http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/jdbc/Batcher.html#addToBatch(org.hibernate.jdbc.Expectation) - RMT
@RMT,感谢您指出了Batcher接口。不幸的是,我现在没有时间验证它是否可行,因为我已经将语句拆分为单独的字符串来解决我的原始问题。等我有时间了,我会再看看Batcher的。 - Janne

1

嗯,我会建议你至少用单引号括起来X和Y。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接