j'ai une liste de noms, par exemple:
List<String> names = ...
names.add('charles');
...
et une déclaration:
PreparedStatement stmt =
conn.prepareStatement('select * from person where name in ( ? )');
comment faire ce qui suit:
stmt.setParameterList(1,names);
Y at-il un travail autour? quelqu'un peut-il expliquer pourquoi cette méthode est manquante?
using: Java, postgresql, jdbc3
Il n'y a pas de moyen propre de le faire simplement en établissant une liste sur la PreparedStatement
que je connaisse.
Écrivez le code qui construit l'instruction SQL (ou remplace mieux un seul? Ou un jeton similaire) avec le nombre approprié de points d'interrogation (le même nombre que dans votre liste), puis parcourez votre liste en définissant le paramètre pour chacun.
Cette question est très ancienne, mais personne n’a suggéré d’utiliser setArray
Cette réponse pourrait aider https://stackoverflow.com/a/10240302/573057
Pour postgres 9, j'ai utilisé cette approche:
jdbcTemplate.query(getEmployeeReport(), new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setTimestamp(1, new Java.sql.Timestamp(from.getTime()));
ps.setTimestamp(2, new Java.sql.Timestamp(to.getTime()));
StringBuilder ids = new StringBuilder();
for (int i = 0; i < branchIds.length; i++) {
ids.append(branchIds[i]);
if (i < branchIds.length - 1) {
ids.append(",");
}
}
// third param is inside IN clause
// Use Types.OTHER avoid type check while executing query
ps.setObject(3, ids.toString(), **Types.OTHER**);
}
}, new PersonalReportMapper());
cette méthode est manquante à cause de type erasure le type de paramètre de la liste est perdu à l'exécution. Par conséquent, il est nécessaire d'ajouter plusieurs méthodes: setIntParameters
, setLongParameters
, setObjectParameters
, etc.
Dans le cas où la question a pour but de définir plusieurs paramètres dans un seul appel ...
Comme la validation de type est déjà définie dans un niveau supérieur, je pense que le seul besoin est pour setObject (...) .
Ainsi, une méthode utilitaire peut être utilisée:
public static void addParams(PreparedStatement preparedStatement, Object... params) throws SQLException {
for (int i = 0; i < params.length; i++) {
Object param = params[i];
preparedStatement.setObject(i+1, param);
}
}
Usage:
SqlUtils.addParams(preparedStatement, 1, '2', 3d);
N'hésitez pas à convertir cela en un lambda Java 8 :)