QueryExecutionRequestException: Not supported for DML operations, @Modifying

이효곤·2023년 4월 12일

트러블슈팅

목록 보기
6/7

@Query("DELETE FROM Favorite f WHERE f.post.id = :postId")

다음 과 같이 JPARepository에 코드를 작성했을 때 다음과 같은 오류가 발생하였습니다.

org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [DELETE FROM...]

저는 이 문제를 해결하기 위해 다음과 같은 코드를 작성하였습니다.

@Transactional
    public void deleteFavoritesByPostId(Long postId) {
        Query query = em.createNativeQuery("DELETE FROM favorite
        WHERE post_id = :postId");
        query.setParameter("postId", postId);
        query.executeUpdate();
    }

오류는 해결되었지만, 구글에 에러의 해결법을 검색해보니

@Query어노테이션에 @Modifying 어노테이션을 추가해주면 오류를 해결할 수 있다고 하네요.
그럼 @Modifying은 어떻게 이걸 해결해주는 걸까요?

@Modifying 이란

  • @Query 어노테이션(JPQL Query, Native Query)을 통해 작성된 INSERT, UPDATE, DELETE (SELECT 제외) 쿼리에서 사용되는 어노테이션이다.
  • 기본적으로 JpaRepository에서 제공하는 메서드 혹은 메서드 네이밍으로 만들어진 쿼리에는 적용되지 않는다.
  • clearAutomatically, flushAutomatically 속성을 변경할 수 있으며 주로 벌크 연산 과 같이 이용된다.

제가 처음에 작성한 쿼리는 DELETE를 한번에 해주는 쿼리였습니다. 네..벌크 연산 문제를 해결해주는 쿼리여서 해결이 되는 것이었습니다.

벌크 연산에 대해서는 다음에 자세히 작성해보겠습니다.

profile
develop

0개의 댓글