Есть ли способ обновить поле базы данных на основе списка? - PullRequest
3 голосов
/ 07 июня 2011

Используя JPA, у меня есть список записей из моей базы данных:

User(id, firstname, lastname, email)

Что я получаю, делая:

List<User> users = User.find("lastname = ?", "smith");

И я хотел бы обновить все в одном запросе, выполнив что-то вроде этого:

"UPDATE USER SET email = null IN :list"

и затем установите параметр "список" на users

Возможно ли это? если да, то как?

Спасибо за вашу помощь:)

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Ну, вы можете встроить запрос, который вы использовали для получения списка, в предложение where обновления.

UPDATE User a SET a.email = null 
WHERE user IN (SELECT b FROM User b WHERE lastName = :?)

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

Как вам это нравится?Как вы думаете, это может работать?

-EDIT-

Поскольку вы хотите использовать оригинальный список элементов вместо списка, только что извлеченного из базы данных, вы можетепо-прежнему убедитесь, что вы строите исходный список следующим образом:

UPDATE User a SET a.email = null 
WHERE user IN (SELECT b FROM User b WHERE lastName IN(:originalList))

Затем, когда вы вызываете его, вы можете сделать что-то вроде этого:

Collection<String> originalList = Arrays.asList("Kenobi", "Skywalker", "Windu");
query.setParameter("originalList", originalList);

Таким образом, вы все равно можете убедиться, чтосодержат только элементы в исходном списке, а не любые возможные новые элементы из базы данных, при условии, что эта фамилия является ключом-кандидатом в базе данных, в противном случае я бы порекомендовал использовать идентификатор для подзапроса вместо фамилии.

0 голосов
/ 07 июня 2011

если у вас есть jpa + hibernate, вы можете использовать entityManager.createQuery () для создания hql-запроса вот так:

String hql = "UPDATE Supplier SET name = :newName WHERE name IN :name";
entityManager.createQuery(hql);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...