2013-11-02 16 views
11

私はUserエンティティとRoleエンティティを持っています。関係は次のように定義されます:SpringデータJPAネイティブクエリ例外例外の削除

ここで、役割を削除すると、その役割を持つすべてのユーザーから役割を削除する必要があります。通常、このロールを持つすべてのユーザーを検索し、リストからロールを削除し、ユーザーを保存することで、このような処理を行います。しかし、100万人を超えるユーザーがいる可能性がある場合、私はアプリ内のこの多くのエンティティをループしたくありません。だから、ネイティブクエリを使用して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.が言っているのか理解していません。レコードはデータベースから削除されますが、この例外はすべてを吹き飛ばす原因となります。

ここで間違っていることを教えてもらえますか?

答えて

26

@Queryで注釈を付けたメソッドは、データベースから読み込むためにクエリを実行します。データベースを更新しないでください。 the documentationとして示さ、それを行うには、メソッドに@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); 

の宣言これは、代わりに選択する1のクエリを更新するなどの方法に注釈付きクエリをトリガします。

+4

ああ、私はまだSpring DataとJPAでかなり新しいです。私はドキュメントにもっと時間を費やすべきだと思う。私はそれを働かせるために '@ Transactional'アノテーションを追加しなければならないことに注意してください。ご協力いただきありがとうございます。 – dnc253