Результирующий набор пуст при использовании createArrayOf в Java с PostgreSQL

#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(?)