it-roy-ru.com

Как настроить список параметров для подготовленной выписки?

у меня есть список имен, например:

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

и заявление:

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

как сделать следующее:

stmt.setParameterList(1,names);

Есть ли обходной путь? Может кто-нибудь объяснить, почему этот метод отсутствует?

используя: Java, postgresql, jdbc3

28
Chris

Нет простого способа сделать это, просто установив список в PreparedStatement, о котором я знаю.

Напишите код, который создает оператор SQL (или лучше заменяет один? Или подобный токен) с соответствующим количеством знаков вопроса (то же число, что и в вашем списке), а затем перебираете свой список, устанавливая параметр для каждого из них.

17
Nick Holt

Этот вопрос очень старый, но никто не предложил использовать setArray

Этот ответ может помочь https://stackoverflow.com/a/10240302/573057

18
earcam

Для Postgres 9 я использовал этот подход:

 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

этот метод отсутствует из-за типа стирания тип параметра List теряется во время выполнения. Поэтому необходимо добавить несколько методов: setIntParameters, setLongParameters, setObjectParameters и т.д.

1
dfa

В случае, если смысл вопросов состоит в том, чтобы установить несколько параметров за один вызов ...

Поскольку валидация типа уже определена на более высоком уровне, я думаю, что единственная потребность в setObject (...) .

Таким образом, служебный метод может быть использован:

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

Использование:

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

Не стесняйтесь конвертировать это в лямбду Java 8 :)

0
AlikElzin-kilaka