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://www.baeldung.com/spring-data-jpa-query
https://www.baeldung.com/spring-data-jpa-modifying-annotation
728x90