#java #arrays #postgresql #prepared-statement #sqlconnection
#ява #массивы #postgresql #подготовленный оператор #sqlconnection #java
Вопрос:
Я пытаюсь запросить таблицу product, используя массив id
s. Вот фрагмент этого метода:
PreparedStatement statement = connection
.prepareStatement("SELECT * FROM product WHERE id IN (?)");
System.out.println(ids /*ArrayList<Integer>*/); //prints [3]
Array array = connection.createArrayOf("INTEGER", ids.toArray());
// Array array = connection.createArrayOf("INTEGER", new Integer[]{1, 2, 3}); //<-----tried this too
statement.setArray(1, array);
ResultSet results = statement.executeQuery();
while (results.next()) {
System.out.println("does not print this");
Product product = new Product(0);
product.setId(results.getInt("id"));
products.add(product);
}
return products;
Таблица product
содержит 3 строки с id
номерами 1, 2 и 3. products
возвращает значение null. Есть идеи, почему?
Спасибо
Редактировать
В соответствии с разделом 9.23.1
Правая часть представляет собой заключенный в скобки список скалярных выражений
пример (1,2,3)
Итак, я думаю, вопрос сводится к следующему: как получить этот список скалярных выражений из моего ArrayList
?
Комментарии:
1. Это не то, как вы заполняете набор SQL. Вы должны предоставить соответствующее количество
?
маркеров и задать значения для них вручную. Массив SQL — это совершенно другой зверь.2. хорошо, так вот как я не делаю это. теперь, как я мог бы это сделать? какие-либо примеры, фрагменты, ресурсы, указатели, сигналы? Спасибо
3. Вы пробовали: ‘SELECT * FROM product WHERE id = ANY(?)’ и работает ли ваш запрос с использованием клиента psql?
4. @SimonSchiff сделайте это ответом, получите свои очки
Ответ №1:
Чтобы проверить в предложении WHERE запроса, находится ли элемент в массиве, вы можете использовать ЛЮБОЙ. В вашем случае:
SELECT * FROM product WHERE id = ANY(?)