Удаление нескольких строк в одном операторе - PullRequest
1 голос
/ 07 декабря 2011

У меня есть какая-то тривиальная таблица в базе данных (скажем, Oracle10g), и мне нужно реализовать при DAO возможность удаления нескольких записей. Метод remove() получает в качестве параметра массив идентификаторов (целых чисел).

На данный момент у меня есть строка запроса "DELETE FROM news WHERE id = ?", которую я использую в PreparedStatement . Я просто добавляю пакет для каждого идентификатора из массива, а затем выполняю execute на PreparedStatement .

Интересно, есть ли возможность выполнить это с помощью одного оператора запроса, что-то вроде "DELETE FROM news WHERE id IN ?". Но я не могу найти, как правильно установить массив целых чисел вместо '?'.

Тот же вопрос относится к Hibernate и JPA . Если есть какие-либо конструкции, чтобы решить эту проблему? Потому что теперь я использую пакетный способ: добавьте Query к Session для каждого идентификатора из массива и совершите транзакцию.

1 Ответ

4 голосов
/ 07 декабря 2011

Лучшее, что я видел, - это динамическое построение строки, используемой PreparedStatement, вставка правильного числа последовательностей из ?,, а затем использование цикла for для вызова setInt в зависимости от ситуации для каждой строки - каждая строка длябыть удаленным в вашем случае.

JPA предоставляет специальный синтаксис для этого (может принять Collection для заполнения списка аргументов), так как он должен создавать SQL в любом случае - и, вероятно, делает это очень похоже накак я только что описал.Подробности относительно вызовов API (как для JPA, так и для HQL) доступны по адресу Hibernate HQL Query: Как установить коллекцию как именованный параметр запроса? .

...