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;