java - queryforlist - jdbctemplate spring ejemplos
¿Cómo se ejecutan IN() consultas SQL con JDBCTemplate de Spring effectivly? (5)
Me preguntaba si hay una manera más elegante de hacer consultas IN () con Spring''s JDBCTemplate. Actualmente hago algo como eso:
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());
}
Lo cual es bastante doloroso ya que si tengo nueve líneas solo para construir la cláusula para la consulta IN (). Me gustaría tener algo así como la sustitución de parámetros de declaraciones preparadas
Consulte here
escribir la consulta con el parámetro nombrado, use ListPreparedStatementSetter
simple con todos los parámetros en secuencia. Solo agregue el siguiente fragmento para convertir la consulta en forma tradicional en función de los parámetros disponibles,
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;
Desea una fuente 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());
Esto solo funciona si getJdbcTemplate()
devuelve una instancia de tipo NamedParameterJdbcTemplate
Hago la consulta "in clause" con spring jdbc como este:
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);
Han cambiado muchas cosas desde 2009, pero solo puedo encontrar respuestas que indiquen que debes usar NamedParametersJDBCTemplate.
Para mí funciona si solo hago un
db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
usando SimpleJDBCTemplate o JDBCTemplate
Si obtiene una excepción para: Tipo de columna inválida
Utilice getNamedParameterJdbcTemplate()
lugar de getJdbcTemplate()
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());
Tenga en cuenta que los segundos dos argumentos se intercambian.