web-dev-qa-db-ger.com

Wie kann man die Liste der Parameter in der vorbereiteten Anweisung festlegen?

ich habe eine Liste mit Namen, z.

List<String> names = ...
names.add('charles');
...

und eine Aussage:

PreparedStatement stmt = 
  conn.prepareStatement('select * from person where name in ( ? )');

wie man folgendes macht:

stmt.setParameterList(1,names);

Gibt es eine Problemumgehung? kann jemand erklären, warum diese Methode fehlt?

using: Java, postgresql, jdbc3

28
Chris

Es gibt keinen sauberen Weg, dies zu tun, indem einfach eine Liste auf der PreparedStatement gesetzt wird, die ich kenne.

Schreiben Sie Code, der die SQL-Anweisung erstellt (oder ein einzelnes Token oder ein ähnliches Token ersetzt) ​​mit der entsprechenden Anzahl von Fragezeichen (die gleiche Anzahl wie in Ihrer Liste), und wiederholen Sie dann Ihre Liste, indem Sie den Parameter für jedes Element festlegen.

17
Nick Holt

Diese Frage ist sehr alt, aber niemand hat die Verwendung von setArray vorgeschlagen.

Diese Antwort könnte hilfreich sein https://stackoverflow.com/a/10240302/573057

18
earcam

Für Postgres 9 habe ich diesen Ansatz verwendet:

 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

diese Methode fehlt aufgrund des Löschens von Typ der Parametertyp der Liste geht zur Laufzeit verloren. Daher müssen mehrere Methoden hinzugefügt werden: setIntParameters, setLongParameters, setObjectParameters usw

1
dfa

Falls die Frage bedeutet, dass mehrere Fragen in einem Anruf festgelegt werden sollen ...

Da die Typvalidierung bereits auf einer höheren Ebene definiert ist, besteht meiner Meinung nach der einzige Bedarf nach setObject (...) .

So kann eine Utility-Methode verwendet werden:

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

Verwendungszweck:

SqlUtils.addParams(preparedStatement, 1, '2', 3d);

Fühlen Sie sich frei, dies in ein Java 8-Lambda umzuwandeln :)

0