データベース(プリペアドステートメント)にパラメータ化されたクエリがある場合、パラメータに値を割り当てても、クエリの構造と実行パスを変更してはなりません(そうでない場合、データベースはパラメータ化されたクエリとして扱わず、例外をスローします)。
そのため、次のようなクエリのステートメントを準備することはできません。
-
select * from myTable order by ?
-
select id, f1, ? from myTable
-
select * from ?
。
各パラメータに値を割り当てると、クエリの実行パスが変更されるためです(プリペアドステートメントのクエリは1回解析され、単一の実行パスになることに注意してください)。
同じルールがHibernateクエリパーサーに適用されます。クエリ構造を変更する値をパラメーターに割り当てないでください。
値が1, 2, 3
の文字列を割り当てる SHOULD-TO-BE-A-NUMBERパラメータへの変換はまったく同じです。実際、最初のクエリはupdate weight_note_receipt set pledge_id =:pledge where wn_id = :wns
とまったく同じように変換されます。 ただし、2番目のものはupdate weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3)
として変換されます。 、明らかに異なる実行パスを持つ異なるクエリ。
したがって、Hibernateが例外をスローしなかったとしても、データベースは例外をスローします。