【问题标题】:Executing multiple native queries in one go一次执行多个本机查询
【发布时间】:2011-10-07 17:52:45
【问题描述】:

我想知道是否可以在 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 的某个地方造成了问题。

只拆分statementsstring 并为每一行单独执行createSQLQuery(statement).executeUpdate() 会更好吗?

【问题讨论】:

  • 示例代码有点不对劲,实际上我是在计算一些金额,不加引号应该没问题吧?

标签: java mysql hibernate native


【解决方案1】:

另一种方法是使用 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() 方法。这将按照您将 m 添加到批次的顺序为您执行所有操作。

    另外:您的语法中的错误是您需要将'Y''X' 放在引号中

    【讨论】:

    • addBatch()executeBatch 来自 java.sql.Statement,但发布者使用的是 Hibernate。
    • 如果我理解正确的话,他将 JDBC 称为问题的可能原因(例如,抛出的异常属于 JDBC 连接器),而不是他会接受 JDBC 中的解决方案。如果 JDBC 可以接受,Janne 可以清除它。
    • Nicolae 是对的,这并不是我真正想要的答案。我还是想用Hibernate的SQLQuery
    • @Janne,对不起,我想我没有像我想象的那样阅读这个问题,但如果你使用 JDBC,这是一个很好的解决方案,所以我不会删除它,因为其他人可以从中学习。此外,这是一个可行的解决方案。
    • @Janne 我正在查看 HIBERNATE api,并且有一些与我建议的非常相似的东西(批处理)docs.jboss.org/hibernate/core/3.2/api/org/hibernate/jdbc/…
    【解决方案3】:

    我会说,你至少必须用单引号括住 X 和 Y。

    【讨论】:

      最近更新 更多