Hello

Spring Data JPA @Modifying 본문

spring

Spring Data JPA @Modifying

nari0_0 2023. 12. 18. 14:35
728x90

Spring Data JPA @Query를 사용해 write 쿼리 작성하는 방법을 정리합니다.

짧게 이야기하면 @Query 사용해 write 쿼리를 작성 할 때 @Modifing 어노테이션이 필요합니다.

@Modifying docs를 보면 @Query 어노테이션을 사용해 정의된 메서드 쿼리에서 INSERT, UPDATE, DELETE, DDL 작성 시 필요하다고 설명되어 있습니다.

 

아래처럼 delete 쿼리 작성 후 호출 하게 되면 '해당 쿼리는 DML 작업을 지원되지 않는 에러가 발생합니다.

    @Query("delete from Test1 t where t.test3 is not null")
    void deleteByTest3IsNotNull();

ERROR

JAVA 8
org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.example.demo.Test1 t where t.test3 is not null]

JAVA 17
org.hibernate.query.IllegalSelectQueryException: Expecting a SELECT Query [org.hibernate.query.sqm.tree.select.SqmSelectStatement], but found org.hibernate.query.sqm.tree.delete.SqmDeleteStatement [delete from Test1 t where t.test3 is NOT null]

@Modifying 어노테이션을 붙여주면 정상적으로 호출하는 것을 확인할 수 있습니다.

	@Modifying
    @Query("delete from Test1 t where t.test3 is not null")
    void deleteByTest3IsNotNull();

 

@Query를 사용하여 삭제 쿼리를 실행하는 것은 Spring Data JPA의 deleteBy 쿼리 메서드와 다르게 작동한다는 점에 유의해야 합니다. 

  • @Query : 데이터베이스에 단일 쿼리가 실행됩니다.
  • deleteBy 쿼리 메서드 : 데이터베이스에서 엔터티를 가져온 다음 하나씩 삭제합니다. 
    이는 수명 주기 메서드 @PreRemove가 해당 엔터티에서 호출된다는 의미입니다. 

@Modifying 옵션

  • flushAutomatically(boolean) : 쿼리를 실행하기 전 컨텍스트에 있는 쿼리 플러시 여부에 대한 옵션
  • clearAutomatically(boolean)  : 쿼리를 실행한 후 컨텍스트 클리어 여부에 대한 옵션

 

https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html#jpa.query-methods.at-query.native

https://www.baeldung.com/spring-data-jpa-query

https://www.baeldung.com/spring-data-jpa-modifying-annotation

https://docs.spring.io/spring-data/data-jpa/docs/current/api/org/springframework/data/jpa/repository/Modifying.html

728x90