【Spring】SQLにパラメータとしてJSON配列を設定したい場合、JSON_ARRAYを使う

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側がシングルクォートで囲われた範囲のパラメータを置き換えないためです。

stackoverflow.com

解決方法

生の配列に入れるのではなく、JSON_ARRAYで囲めば大丈夫でした。

select  JSON_OVERLAPS(table.json_array,JSON_ARRAY(:arrayValues))
from table;