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() 查询的子句。我想要类似准备好的语句的参数替换

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

我使用 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);
于 2012-02-08T07:00:45.273 回答
19

如果您遇到以下异常:无效的列类型

请使用getNamedParameterJdbcTemplate()代替getJdbcTemplate()

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

请注意,后两个参数是交换的。

于 2014-05-13T02:42:41.273 回答
2

参考这里

使用命名参数编写查询,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;
于 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 回答