2013-12-17 137 views
5

當我嘗試使用本機SQL更新數據時出現此錯誤。這是我的腳本:休眠:無法執行本地批量操作查詢

update weight_note_receipt set pledge_id =:pledge where wn_id in (:wns) 

wns是包含字符串超過1 wn_id這樣的:

222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,302,303,306,307,330,332,333,337,338,339,341,368,371,376,377,378,379,380,381,385,391,397,423,424,443,452,454,461,462,463,464,490,503,504,521,525,528,529,530,532,533,549,554,560,561,564,565,566,567,569,570,595,598,600,603,605,606,607,644,646,649,653,661,662,663,667,669,678,683,752,1039,1075,258,259,260,261,268,269,270,287,304,305,308,325,334,604,643,647,648,659,660,664,665,666,704,709,753,754,757,758,809,834,846,861,872,879,882,911,913,916,919,920,164 

當我更新(用query.executeUpdate()),它引發以下錯誤:

Request processing failed; nested exception is org.hibernate.exception.DataException: could not execute native bulk manipulation query] with root cause com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,302,303,306,307,330,332,333,337,338,339,341,368,371,376,'

是否因爲輸入字符串太長?

回答

10

當在數據庫(預處理語句)中進行參數化查詢時,爲參數賦值不得改變查詢的結構和執行路徑(否則數據庫不會將它們視爲參數化查詢並引發異常)。

這就是爲什麼你不能有準備好的發言之類的查詢:

  • select * from myTable order by ?
  • select id, f1, ? from myTable
  • select * from ?

因爲爲每個參數賦值會更改查詢執行路徑(請記住,準備好的語句的查詢會被解析一次並生成單個執行路徑)。

相同的規則適用於Hibernate查詢解析器,您不應該爲參數指定一個更改查詢結構的值。

分配與值1, 2, 3一個字符串到應該-TO-BE-A-NUMBER參數是一樣的,實際上所述第一查詢將被剛剛翻譯相同update weight_note_receipt set pledge_id =:pledge where wn_id = :wns但第二個將被翻譯爲update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3),具有不同執行路徑的查詢明顯不同。

所以即使Hibernate沒有拋出異常,你的數據庫也會這樣。

+2

我還是不明白,但你的解決方案運行良好,非常感謝 –

+0

剩下的問題是什麼? –

+0

現在,我明白了,非常感謝 –

1

如果您使用SQLQuery Hibernate API,則可以使用setParameterList(PARAM, COLLECTION)方法。

您的查詢字符串可以與其in子句和大括號保持一致。

+1

它必須保持不變。沒有大括號它將無法工作。 – John

相關問題