2013-12-17 21 views
5

ネイティブSQLを使用してデータを更新しようとしたときにこのエラーが発生しました。これは私のスクリプトです:Hibernate:ネイティブの一括操作クエリを実行できませんでした

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 ?:あなたのようなクエリのために準備されたステートメントを持つことができない理由

    がそれです。

各パラメータに値を割り当てると、クエリの実行パスが変更されるためです(プリペアドステートメントのクエリは1回解析され、1つの実行パスが生成されることに注意してください)。

Hibernateクエリパーサにも同じ規則が適用されますが、クエリ構造を変更する値をパラメータに割り当てることはできません。 SHOULD-TO-BE-A-NUMBERパラメータの値1, 2, 3文字列を割り当てる

が、実際には最初のクエリは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

関連する問題