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;
}
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);
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).