web-dev-qa-db-ja.com

SpringのJDBCTemplateでIN()SQLクエリを効果的に実行する方法は?

SpringのJDBCTemplateでIN()クエリを実行するよりエレガントな方法があるかどうか疑問に思っていました。現在、私はそのようなことをしています:

StringBuilder jobTypeInClauseBuilder = new StringBuilder();
for(int i = 0; i < jobTypes.length; i++) {
    Type jobType = jobTypes[i];

    if(i != 0) {
        jobTypeInClauseBuilder.append(',');
    }

    jobTypeInClauseBuilder.append(jobType.convert());
}

IN()クエリの句を作成するためだけに9行ある場合、これは非常に苦痛です。準備済みステートメントのパラメーター置換のようなものが欲しい

164
Malax

パラメーターソースが必要です。

Set<Integer> ids = ...;

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);

List<Foo> foo = getJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",
     parameters, getRowMapper());

これはgetJdbcTemplate()NamedParameterJdbcTemplate 型のインスタンスを返す場合にのみ機能します

241
yawn

次のように、Spring jdbcで「in句」クエリを実行します。

String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid IN (:goodsid)";

List ids = Arrays.asList(new Integer[]{12496,12497,12498,12499});
Map<String, List> paramMap = Collections.singletonMap("goodsid", ids);
NamedParameterJdbcTemplate template = 
    new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());

List<Long> list = template.queryForList(sql, paramMap, Long.class);
52
janwen

次の例外が発生した場合:無効な列タイプ

getNamedParameterJdbcTemplate()ではなくgetJdbcTemplate()を使用してください

 List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
 getRowMapper());

2番目の2つの引数が入れ替わっていることに注意してください。

16
Mahmood Omari

here を参照してください

名前付きパラメーターを使用してクエリを記述し、すべてのパラメーターを順番に並べた単純なListPreparedStatementSetterを使用します。以下のスニペットを追加して、使用可能なパラメーターに基づいて従来の形式のクエリを変換し、

ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(namedSql);

    List<Integer> parameters = new ArrayList<Integer>();
    for (A a : paramBeans)
        parameters.add(a.getId());

    MapSqlParameterSource parameterSource = new MapSqlParameterSource();
    parameterSource.addValue("placeholder1", parameters);
    // create SQL with ?'s
    String sql = NamedParameterUtils.substituteNamedParameters(parsedSql, parameterSource);

    return sql;
1