JDBC: в заданном состоянии: можно ли передать набор как один параметр? - PullRequest
4 голосов
/ 16 сентября 2010

В JDBC я могу использовать вопросительные знаки для параметров запроса, например:

"SELECT * FROM users WHERE login = ?"

и затем

ps.setString(1, "vasya");

Но как я могу запросить список имен входа:

"SELECT * FROM users WHERE login IN ?"

предположим, у меня есть

List<String> logins = ...

Что я должен набрать там:

ps.setWhat(1, what);

Я мог бы переписать запрос как:

"SELECT * FROM users WHERE login = ? OR login = ? OR login = ?"

изатем вызовите setString в цикле, но я хотел бы знать, возможно ли передать набор элементов как один параметр в запросе.

Может быть, существуют специфичные для поставщика расширения?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2010

Существуют специфические способы сделать это, поэтому было бы хорошо знать, какую базу данных вы используете. Я знаю решения для PostgreSQL и H2. Я реализовал эту функцию в базе данных H2, так что это то, что я знаю лучше всего:

База данных H2

PreparedStatement prep = conn.prepareStatement(
  "select * from users where login in (select * from table(x int = ?))");
prep.setObject(1, new Object[] { "1", "2" });
ResultSet rs = prep.executeQuery();

PostgreSQL

WHERE login = ANY(?)

Затем установите параметр в массив значений, используя PreparedStatement.setArray (..) (не setObject, как для H2).

3 голосов
/ 16 сентября 2010

Смотрите здесь для обзора доступных опций. Насколько я могу сказать, каждый динамически генерирует необходимое количество символов-заполнителей (с некоторыми оптимизациями).

В PreparedStatement есть метод setArray, но иногда его использование неосуществимо. Вы можете попробовать это.

Если Spring JDBCTemplate является опцией, вы можете использовать автоматическое расширение коллекции, как описано здесь .

0 голосов
/ 16 сентября 2010
//---

String query = "SELECT * FROM users WHERE login = ?";    

List<Login> list = new ArrayList<Login>();      
Login login = null;

for(String param : conditions){

    pStmt.setString(1,param);

    rSet = pStmt.executeQuery();    

            if(rSet.next()){

                login = new Login();
                login.setName(rSet.getString(1));

                list.add(login);
            }
}

return list;

//---

условиями будет список элементов, по которым вы хотите получить поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...