Je me demandais s'il existe un moyen plus élégant de faire des requêtes IN () avec le JDBCTemplate de Spring. Actuellement, je fais quelque chose comme ça:
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());
}
Ce qui est assez pénible puisque si j'ai neuf lignes juste pour construire la clause pour la requête IN (). Je voudrais avoir quelque chose comme la substitution de paramètres des instructions préparées
WHERE NOT EXISTS (SELECT ...)
.Je fais la requête "in clause" avec spring jdbc comme ceci:
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);
la source
Si vous obtenez une exception pour: Type de colonne non valide
Veuillez utiliser à la
getNamedParameterJdbcTemplate()
place degetJdbcTemplate()
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters, getRowMapper());
Notez que les deux seconds arguments sont permutés.
la source
Reportez-vous ici
écrire une requête avec un paramètre nommé, utiliser simple
ListPreparedStatementSetter
avec tous les paramètres dans l'ordre. Ajoutez simplement l'extrait ci-dessous pour convertir la requête sous forme traditionnelle en fonction des paramètres 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;
la source
Beaucoup de choses ont changé depuis 2009, mais je ne trouve que des réponses indiquant que vous devez utiliser NamedParametersJDBCTemplate.
Pour moi, ça marche si je fais juste un
db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
en utilisant SimpleJDBCTemplate ou JDBCTemplate
la source
listeParamsForInClause
ne sera pas échappé et vous rend vulnérable à l'injection SQL.