Pergunta

Eu queria saber se existe uma maneira mais elegante de fazer em () consultas com o JDBCTemplate da Spring. Atualmente eu faço algo assim:

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());
}

O que é bastante doloroso, pois se eu tiver nove linhas apenas para construir a cláusula para a consulta in (). Eu gostaria de ter algo como a substituição de parâmetros de declarações preparadas

Foi útil?

Solução

Você quer uma fonte de parâmetro:

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());

Isso só funciona se getJdbcTemplate() Retorna uma instância do tipo NamedParameterJdbcTemplate

Outras dicas

Eu faço a consulta "In Ine In" com JDBC da primavera assim:

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);

Se você obtiver uma exceção para: tipo de coluna inválida

Por favor, use getNamedParameterJdbcTemplate() ao invés de getJdbcTemplate()

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

Observe que os dois segundos argumentos são trocados.

Referir-se aqui

Escreva consulta com o parâmetro nomeado, use simples ListPreparedStatementSetter com todos os parâmetros em sequência. Basta adicionar snippet abaixo para converter a consulta em forma tradicional baseada em parâmetros disponíveis,

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;

Muitas coisas mudaram desde 2009, mas só posso encontrar respostas dizendo que você precisa usar o nome do nome do nome do nome.

Para mim, funciona se eu apenas fizer um

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

Usando simplesjdbctemplate ou jdbctemplate

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top