web-dev-qa-db-fra.com

Comment passer une liste de valeurs en tant que paramètre de la clause IN à l'aide du modèle jdbc

Je souhaite transmettre les noms de voiture en tant que variable de liaison (modifications à l'exécution).

Java version 1.7 

private JdbcTemplate jdbcTemplate;

 public Collection<Cars> findAll(){

 String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in ('Honda','Audi','Benz')";
        List<Cars> carsList = new ArrayList<Cars>();
        List<Map<String, Object>> 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;
    }
6
Jan69

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

String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (:cars)";
List<Cars> carsList = new ArrayList<Cars>();
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(datasource);
List<String> carNames = new ArrayList<String>();
for(Car car : carList){
    carNames.add(car.getName());
}
SqlParameterSource namedParameters = new MapSqlParameterSource("cars", carNames);
namedParameterJdbcTemplate.queryForObject(sql, namedParameters, ResponseType.class);
9
Darshan Mehta
jdbcTemplate.queryForList(
    "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
    new Object[] { "Honda", "Audi", "Benz" }
);

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

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

Notez également que les bases de données différentes ont des limites différentes quant à 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 (décomposez-le en "lots" de taille appropriée ou utilisez une approche différente).

1
Jiri Tousek