2013-11-02 11 views
11

Ich habe eine User Einheit und eine Role Einheit. Die Beziehung ist wie folgt definiert:Spring Data JPA löschen native Abfrage werfen Ausnahme

@OneToMany 
@JoinTable(name="USER_ROLES", [email protected](name="ROLE_ID")) 
private List<Role> roles = null; 

Nun, wenn ich eine Rolle löschen, muss ich die Rolle von allen Benutzern löschen, die diese Rolle haben. Normalerweise würden Sie so etwas tun, indem Sie alle Benutzer mit dieser Rolle nachschlagen, die Rolle aus der Liste entfernen und den Benutzer speichern. Wenn es jedoch über eine Million Benutzer geben kann, möchte ich nicht über diese vielen Entitäten in der App hinausgehen. Also möchte ich eine native Abfrage verwenden, um Zeilen aus der Join-Tabelle USER_ROLES zu entfernen. Ich habe versucht, diese zu meinen Repository:

@Query(value="DELETE FROM user_roles WHERE role_id = ?1", nativeQuery=true) 
public void deleteRoleFromUsersWithRole(Long roleId); 

Allerdings, wenn ich dies tun, sehe ich die folgenden in den Protokollen:

[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 = ?") 

Ich verstehe nicht, was No results were returned by the query. sagt. Der Datensatz wird aus der Datenbank gelöscht, aber durch diese Ausnahme wird alles in die Luft gesprengt.

Kann mir bitte jemand sagen, was ich hier falsch mache?

Antwort

26

Eine mit @Query annotierte Methode führt eine Abfrage aus, um aus der Datenbank zu lesen. Die Datenbank nicht aktualisieren. Um das zu tun, als the documentation angegeben, müssen Sie die @Modifying Anmerkung die Methode hinzuzufügen:

Alle Abschnitte oben beschreiben, wie Abfragen zu erklären, eine bestimmte Einheit oder eine Sammlung von Entitäten zugreifen. Natürlich können Sie benutzerdefiniertes Änderungsverhalten hinzufügen, indem Sie die in Abschnitt 1.3, "Benutzerdefinierte Implementierungen für Spring-Datenrepositorys" beschriebenen Funktionen verwenden. Da dieser Ansatz für umfassende benutzerdefinierte Funktionen durchführbar ist, können Sie die Ausführung modifizierender Abfragen erreichen, die eigentlich nur eine Parameterbindung benötigen, indem Sie die Abfragemethode mit @Modifying annotieren: Beispiel 2.13. Manipulieren Deklarieren abfragt

@Modifying 
@Query("update User u set u.firstname = ?1 where u.lastname = ?2") 
int setFixedFirstnameFor(String firstname, String lastname); 

Diese die Abfrage an die Methode kommentierten löst als Abfrage Aktualisierung statt eines eine Auswahl.

+4

Ah, ich bin noch ziemlich neu bei Spring Data und JPA. Ich denke, ich sollte mehr Zeit in der Dokumentation verbringen. Ich sollte beachten, dass ich auch die "@ Transactional" Annotation hinzufügen musste, damit es funktioniert. Danke für Ihre Hilfe. – dnc253

Verwandte Themen