Spring Data JPA исключить собственное исключение броска запросов
У меня есть объект User
и объект Role
. Связь определяется следующим образом:
@OneToMany
@JoinTable(name="USER_ROLES", [email protected](name="ROLE_ID"))
private List<Role> roles = null;
Теперь, когда я удаляю роль, мне нужно удалить роль от всех пользователей, у которых есть эта роль. Обычно вы делаете что-то вроде этого, просматривая всех пользователей с этой ролью, удаляя роль из списка и сохраняя пользователя. Однако, когда может быть более миллиона пользователей, я не хочу перебирать это множество объектов в приложении. Итак, я хочу использовать собственный запрос для удаления строк из таблицы соединения USER_ROLES
. Я попытался добавить это в мой репозиторий:
@Query(value="DELETE FROM user_roles WHERE role_id = ?1", nativeQuery=true)
public void deleteRoleFromUsersWithRole(Long roleId);
Однако, когда я это делаю, я вижу следующее в журналах:
[EL Fine]: sql: 2013-11-02 14:27:14.418--ClientSession(707349235)--Connection(2096606500)--Thread(Thread[http-bio-8080-exec-4,5,main])--DELETE FROM user_roles WHERE role_id = ?
bind => [1000110139999999953]
[EL Fine]: sql: 2013-11-02 14:27:14.478--ClientSession(707349235)--Thread(Thread[http-bio-8080-exec-4,5,main])--SELECT 1
[EL Warning]: 2013-11-02 14:27:14.482--UnitOfWork(1795045370)--Thread(Thread[http-bio-8080-exec-4,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: No results were returned by the query.
Error Code: 0
Call: DELETE FROM user_roles WHERE role_id = ?
bind => [1000110139999999953]
Query: DataReadQuery(sql="DELETE FROM user_roles WHERE role_id = ?")
Я не понимаю, что говорит No results were returned by the query.
. Запись удаляется из базы данных, но это исключение вызывает все взорвение.
Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?
Ответы
Ответ 1
Метод, аннотированный с помощью @Query, выполняет запрос для чтения из базы данных. Не обновлять базу данных. Чтобы сделать это, как указано документация, вам нужно добавить аннотацию @Modifying
к методу:
Все вышеприведенные разделы описывают, как объявлять запросы для доступа к данному объекту или коллекции объектов. Конечно, вы можете добавить настраиваемое поведение для изменения, используя средства, описанные в разделе 1.3, "Пользовательские реализации для Spring Хранилищ данных". Поскольку этот подход является выполнимым для всеобъемлющих пользовательских функций, вы можете добиться выполнения модифицирующих запросов, которые на самом деле нуждаются только в связывании параметров, аннотируя метод запроса с помощью @Modification:
Пример 2.13. Объявление манипулирующих запросов
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
Это вызовет запрос, аннотированный для метода, как обновление запроса, а не его выбор.