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行ある場合、これは非常に苦痛です。準備済みステートメントのパラメーター置換のようなものが欲しい
パラメーターソースが必要です。
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
型のインスタンスを返す場合にのみ機能します
次のように、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);
次の例外が発生した場合:無効な列タイプ
getNamedParameterJdbcTemplate()
ではなくgetJdbcTemplate()
を使用してください
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());
2番目の2つの引数が入れ替わっていることに注意してください。
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;