web-dev-qa-db-fra.com

Comment exécuter efficacement des requêtes SQL IN () avec le modèle JDBCT de Spring?

Je me demandais s'il existait un moyen plus élégant de faire des requêtes IN () avec 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 d'instructions préparées

169
Malax

Vous voulez une source de paramètre:

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

Ceci ne fonctionne que si getJdbcTemplate() renvoie une instance de type NamedParameterJdbcTemplate

249
yawn

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

Si vous obtenez une exception pour: Type de colonne non valide

Veuillez utiliser getNamedParameterJdbcTemplate() au lieu de getJdbcTemplate()

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

Notez que les deux deuxièmes arguments sont échangés.

16
Mahmood Omari

Reportez-vous à ici

écrire une requête avec un paramètre nommé, utilisez simple ListPreparedStatementSetter avec tous les paramètres en séquence. Il suffit d’ajouter l’extrait ci-dessous pour convertir la requête sous forme traditionnelle en 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;
1
Abhishek Chatterjee