Foo を含む MySQL テーブルがあります。各 Foo には、一意でない数値コードと名前があります。次に、特定のコードのいずれかを持つ Foo の名前が、特定の文字列で始まるかどうかを調べる必要があります。通常の SQL では、これは簡単です。
select * from FOO where CODE in (2,3,5) and NAME like 'bar%';
しかし、これを Spring で適切に実行するにはどうすればよいでしょうか? 「like」演算子を必要とせずに、次のように実行します。
public List<Foo> getByName(List<Integer> codes, String namePart) {
String sql = "select * from FOO where CODE in (:codes) and NAME=:name"
Map<String,Object> params = new HashMap<String,Object>();
params.put("codes", codes);
params.put("name", namePart);
return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params);
}
ただし、「like」では何も機能しないようです:名前付きパラメータの代わりにプレースホルダーを使用する場合、、、NAME like :name%
またはNAME like ':name%'
。NAME like ?%
残酷な言い方をすれば、
String sql = "select * from FOO where CODE in (:codes) and NAME like '"+namePart+"%'";`
しかし、Spring が入力パラメータを適切にサニタイズしてくれると、もっといいのは明らかです。
Spring は何らかの形でこれをサポートしていると思うかもしれませんが、私にはわかりません。
ベストアンサー1
待ってください、もちろん、一日を終える前に「最後にもう 1 つ試す」必要がありましたが、なんと、すべてのユニット テストが突然合格しました。
public List<Foo> getByName(List<Integer> codes, String namePart) {
String sql = "select * from FOO where CODE in (:codes) and NAME like :name"
Map<String,Object> params = new HashMap<String,Object>();
params.put("codes", codes);
params.put("name", namePart+"%");
return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params);
}
パラメータに「%」を入力することは考えていませんでした。Spring が自動的にエスケープしてくれると確信していました。正しくやっているのだろうか?