7 votes

Comment passer une liste de valeurs en tant que paramètre à la clause IN en utilisant le modèle jdbc

Je veux passer les noms des voitures en tant que variable de liaison (changements en cours d'exécution). Comment y parvenir.

Java Version 1.7

private JdbcTemplate jdbcTemplate;

 public Collection findAll(){

 String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in ('Honda','Audi','Benz')";
        List carsList = new ArrayList();
        List> rows = jdbcTemplate.queryForList(sql);
        for (Map row : rows) {
            Cars car = new Cars();
            car.setName(String.valueOf(row.get("NAME")));
            car.setType(String.valueOf(row.get("TYPE")));
            car.setYear(String.valueOf(row.get("YEAR")));

            carsList.add(car);
        }
        return carsList;
    }

12voto

Darshan Mehta Points 4787

Utilisez des paramètres nommés comme expliqué ici, par exemple :

String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (:cars)";
List carsList = new ArrayList();
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(datasource);
List carNames = new ArrayList();
for(Car car : carList){
    carNames.add(car.getName());
}
SqlParameterSource namedParameters = new MapSqlParameterSource("cars", carNames);
namedParameterJdbcTemplate.queryForObject(sql, namedParameters, ResponseType.class);

1voto

Jiri Tousek Points 3502
jdbcTemplate.queryForList(
    "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
    new Object[] { "Honda", "Audi", "Benz" }
);

Vous devriez probablement encapsuler la logique dans une méthode qui accepte les valeurs IN et génère une séquence appropriée de points d'interrogation.

Certaines frameworks (comme MyBatis) ont un support intégré pour cela.

Gardez également à l'esprit que différents BD ont des limites différentes sur la longueur de la liste IN (ou de la requête dans son ensemble). Si vous avez trop de valeurs à mettre dans la clause IN, vous devrez gérer cela (le diviser en "lots" de taille appropriée ou utiliser une approche différente).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X