web-dev-qa-db-ja.com

Spring Data JPAのdeleteByクエリが機能しない

リポジトリでカスタムdeleteByメソッドクエリを作成しようとしています。 hibernateは削除する代わりに、selectステートメントを作成しているようです。

public interface ContactRepository extends JpaRepository<Contact, Integer> {

    Integer deleteByEmailAddress(String emailAddress);

    //and this one works
    Contact findContactByName(String name);
}

そして、Hibernateがやろうとしていることは次のとおりです。

Hibernate:contact0_.idをid1_2_として、contact0_.emailAddressを> emailAdd2_2_として、contact0_.nameをname3_2_として、contact contact0_から選択します。ここで、> contact0_.emailAddress =?

私は何が欠けていますか?削除を機能させるために特別な構成を行う必要がありますか?

15
Alexandru Pirvu

削除が機能しない、または期待どおりに機能しない?通常、エンティティは削除する前に管理する必要があるため、JPAプロバイダー(この場合は休止状態)が最初にエンティティを読み込み(表示されるクエリ)、次に削除を発行します。

クエリのみが表示され、対応する削除が表示されない場合、いくつかの可能性があります。

  1. 削除するものはありません。レコードがデータベースにあることを確認してください
  2. 削除はトランザクションの一部である必要があります。 SpringデータのCRUD操作はデフォルトでトランザクション対応であると考えています。deleteByEmailAddressを呼び出しているものがトランザクション対応であることを確認するだけではありません

注:変更クエリ削除を使用してエンティティを削除する場合、選択を回避できます。以下に例を示します。

// NOTE: you have return void
@Modifying
@Transactional
@Query(value="delete from Contact c where c.emailAddress = ?1")
void deleteByEmailAddress(String emailAddress)
31
ikumen

Spring Data JPA(> = 1.7.x)の最新バージョンでは、削除、削除、およびカウント操作のクエリ派生にアクセスできます。

春のデータ:「削除者」はサポートされていますか?

4

クエリの削除呼び出しを、それ専用のサービスクラスに移動してみてください。

@FunctionalInterface
public interface DeleteService {

    public int deleteIfExists(Date fechaProceso);

}

そして、例えばDeleteServiceImpl.Javaに実装します

0
T21