Java Spring Framework で「something%」のような文字列を検索するにはどうすればよいでしょうか? 質問する

Java Spring Framework で「something%」のような文字列を検索するにはどうすればよいでしょうか? 質問する

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 が自動的にエスケープしてくれると確信していました。正しくやっているのだろうか?

おすすめ記事