javajdbcprepared-statementin-clause

PreparedStatement with list of parameters in a IN clause


How to set value for in clause in a preparedStatement in JDBC while executing a query.

Example:

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

If this in-clause can hold multiple values how can I do it. Sometimes I know the list of parameters beforehand or sometimes I don't know beforehand. How to handle this case?


Solution

  • What I do is to add a "?" for each possible value.

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

    Alternative using StringBuilder (which was the original answer 10+ years ago)

    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 = ... 
    

    And then happily set the params

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