150 votes

PreparedStatement avec liste de paramètres dans une clause IN

Comment définir la valeur de la clause in dans une instruction preparedStatement dans JDBC lors de l'exécution d'une requête.

Exemple :

connection.prepareStatement("Select * from test where field in (?)");

Si cet article peut contenir plusieurs valeurs, comment le faire ? Parfois je connais la liste des paramètres à l'avance ou parfois je ne sais pas à l'avance. Comment gérer cette affaire ?

161voto

OscarRyz Points 82553

Ce que je fais est d'ajouter un "?" pour chaque valeur possible.

var stmt = String.format("select * from test where field in (%s)",
                         values.stream()
                         .map(v -> "?")
                         .collect(Collectors.joining(", ")));

Alternative utilisant StringBuilder (ce qui était la réponse originale il y a plus de 10 ans)

List values = ... 
StringBuilder builder = new StringBuilder();

for( int i = 0 ; i < values.size(); i++ ) {
    builder.append("?,");
}

String placeHolders =  builder.deleteCharAt( builder.length() -1 ).toString();
String stmt = "select * from test where field in ("+ placeHolders + ")";
PreparedStatement pstmt = ... 

Et puis heureusement mettre les params

int index = 1;
for( Object o : values ) {
   pstmt.setObject(  index++, o ); // or whatever it applies 
}
   

   

77voto

madx Points 159

Vous pouvez utiliser la méthode setArray comme mentionné dans le javadoc ci-dessous :

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int, java.sql.Array)

Code :

PreparedStatement statement = connection.prepareStatement("Select * from test where field in (?)");
Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"A1", "B2","C3"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();

13voto

Asaph Points 56989

Vous ne pouvez pas remplacer ? dans votre requête par un nombre arbitraire de valeurs. Chaque ? est un espace réservé pour une seule valeur. Pour supporter un nombre arbitraire de valeurs, vous devrez construire dynamiquement une chaîne contenant ?, ?, ?, ... , ?, le nombre de points d'interrogation étant le même que le nombre de valeurs que vous souhaitez dans votre clause in.

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