web-dev-qa-db-fra.com

Comment définir une liste de paramètres sur une déclaration préparée?

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

28
Chris

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.

17
Nick Holt

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

18
earcam

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());
2
junior

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.

1
dfa

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 :)

0
AlikElzin-kilaka