187

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行あるとしたら、これは非常に苦痛です。プリペアドステートメントのパラメータ置換のようなものが欲しいのですが

4

5 に答える 5

289

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

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

于 2009-08-25T09:54:43.463 に答える
66

次のように、springjdbcを使用して「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);
于 2012-02-08T07:00:45.273 に答える
19

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

getNamedParameterJdbcTemplate()代わりに使用してくださいgetJdbcTemplate()

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

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

于 2014-05-13T02:42:41.273 に答える
2

こちらをご覧ください

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

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;
于 2015-02-07T21:44:53.990 に答える
-3

2009年以降、多くの変更がありましたが、NamedParametersJDBCTemplateを使用する必要があるという回答しか見つかりません。

私にとっては、

db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));

SimpleJDBCTemplateまたはJDBCTemplateを使用する

于 2016-09-30T09:29:21.723 に答える