Как настроить список параметров для подготовленной выписки? - PullRequest
28 голосов
/ 20 августа 2009

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

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

и заявление:

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

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

stmt.setParameterList(1,names);

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

использование: java, postgresql, jdbc3

Ответы [ 8 ]

19 голосов
/ 07 ноября 2012

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

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

17 голосов
/ 20 августа 2009

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

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

2 голосов
/ 10 мая 2011

Для 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());
1 голос
/ 20 августа 2009

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

0 голосов
/ 10 апреля 2016

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

Поскольку валидация типа уже определена на более высоком уровне, я думаю, что единственная потребность в 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 голосов
/ 15 марта 2015

Изучив различные решения на разных форумах и не найдя хорошего решения, я чувствую, что нижеприведенный хак, который я придумал, является самым простым для отслеживания и написания кода. Однако обратите внимание, что он не использует подготовленный запрос, но все равно выполняет работу:

Пример. Предположим, у вас есть список параметров для передачи в предложении «IN». Просто поместите фиктивную строку внутри предложения IN, скажем, «ПАРАМ» означает список параметров, которые будут приходить на место этой фиктивной строки.

    select * from TABLE_A where ATTR IN (PARAM);

Вы можете собрать все параметры в одну строковую переменную в своем коде Java. Это можно сделать следующим образом:

    String param1 = "X";
    String param2 = "Y";
    String param1 = param1.append(",").append(param2);

Вы можете добавить все свои параметры, разделенные запятыми, в одну строковую переменную 'param1', в нашем случае.

После сбора всех параметров в одну строку вы можете просто заменить фиктивный текст в вашем запросе, т.е. в данном случае «PARAM», на параметр String, то есть param1. Вот что вам нужно сделать:

    String query = query.replaceFirst("PARAM",param1); where we have the value of query as 

    query = "select * from TABLE_A where ATTR IN (PARAM)";

Теперь вы можете выполнить ваш запрос, используя метод executeQuery (). Просто убедитесь, что в вашем запросе нигде нет слова «PARAM». Вы можете использовать комбинацию специальных символов и алфавитов вместо слова «PARAM», чтобы исключить вероятность появления такого слова в запросе. Надеюсь, у вас есть решение.

0 голосов
/ 02 июля 2014

Другой метод:

public void setValues(PreparedStatement ps) throws SQLException {
    // first param inside IN clause with myList values
    ps.setObject(1 , myList.toArray(), 2003); // 2003=array in java.sql.Types
}
0 голосов
/ 24 июля 2012

Я просматривал код сегодня утром, и один из моих коллег использовал другой подход, просто передайте параметр, используя setString("name1','name2','name3").

Примечание: Я пропустил одинарную кавычку в начале и в конце, потому что они будут добавлены setString.

...