如何有效地使用Spring的JDBCTemplate执行IN()SQL查询?

时间:2009-08-25 09:16:58

标签: java sql spring jdbc jdbctemplate

我想知道是否有一种更优雅的方式来使用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()查询的子句。我希望有类似于预编译语句的参数替换

5 个答案:

答案 0 :(得分:238)

您需要参数来源:

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

类型的实例时才有效

答案 1 :(得分:51)

我使用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);

答案 2 :(得分:16)

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

请使用getNamedParameterJdbcTemplate()代替getJdbcTemplate()

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

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

答案 3 :(得分:1)

参考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;

答案 4 :(得分:-5)

自2009年以来,许多事情发生了变化,但我只能找到答案,说你需要使用NamedParametersJDBCTemplate。

对我而言,只要我做一个

就可以了
db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));

使用SimpleJDBCTemplate或JDBCTemplate