2011-07-18 182 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 –