NamedParameterJdbcTemplateに対して発行するクエリで、JSON配列をパラメータとして設定する所で詰まったので、備忘用のメモです。
状況
以下のような処理を行うクエリを作成していました。
select JSON_OVERLAPS(/* テーブルから取得したJSON配列 */, /* パラメータとして設定したJSON配列 */) from ...
実装当初は、以下のように、JSON配列を表す'[]'の中にプリペアドステートメントを用意する形で考えていました。
// Java上のパラメータ設定 MapSqlParameterSource("arrayValues", arrayValues);
-- 発行するクエリ select JSON_OVERLAPS(table.json_array,'[:arrayValues]') from table;
起きた問題
先程紹介したクエリでは、:arrayValuesが置き換えられず、実行時エラーが発生します。
これが置き換えられない原因は、SQLインジェクション対策で、Spring側がシングルクォートで囲われた範囲のパラメータを置き換えないためです。
解決方法
生の配列に入れるのではなく、JSON_ARRAYで囲めば大丈夫でした。
select JSON_OVERLAPS(table.json_array,JSON_ARRAY(:arrayValues)) from table;