Como executar em () SQL Consultas com o JDBCTemplate de Spring eficazmente?
-
19-09-2019 - |
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
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