Spring

Spring - JPA @Modifying return value

codeManager 2024. 3. 25. 22:40
반응형

 

JPA에서 @Modifying 어노테이션 사용 시 주의할 점에 대해서 알아보겠습니다.

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;
   
    private String email;
    
    private boolean active;
}

 

 

JPA에서 @Query 어노테이션은 특정 JPQL 또는 SQL 쿼리를 작성할 수 있는 기회를 제공합니다.

 

@Modifying 어노테이션은 @Query 어노테이션을 향상시켜 SELECT 쿼리뿐만 아니라 INSERT, UPDATE, DELETE, 심지어 DDL 쿼리까지 실행할 수 있습니다.

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    @Modifying
    @Query("delete user where active = false")
    long deleteDeactitveUsers();
}

 

 

@Modifying 쿼리에서 return value를 long으로 하면 다음과 같은 에러가 발생합니다.

 

Caused by: java.lang.IllegalArgumentException: Modifying queries can only use void or int/Integer as return type!

 

 

@Modifying 쿼리를 사용할 때는 void나 int/Integer 타입만 return type으로 사용할 수 있습니다.

 

 

쿼리를 이렇게 바꿔주면 정상 동작합니다.

@Modifying
@Query("delete user where active = false")
int deleteDeactitveUsers();

 

 

이때 int/Integer 반환 값은 데이터베이스에서 업데이트된 행의 개수입니다.

반응형