Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: Modifying queries can only use void or int/Integer as return type! Offending method: public abstract com.example com.example.repository.myRepository.mySave(int,int,java.lang.String); nested exception is java.lang.IllegalArgumentException: Modifying queries can only use void or int/Integer as return type! Offending method: public abstract com.emaxple com.example.repository.myRepository.mySave(int,int,java.lang.String)]
위 오류는 네이티브 쿼리를 사용할 때 발생하는 오류이다.
네이티브 쿼리를 사용하면 JPARepository의 쿼리를 직접 조작하면 @Modifying 어노테이션을 붙이게 되는데
이 어노테이션을 사용하면, void로 리턴 값이 없거나 int만 리턴할 수 있다. (만약 int를 리턴한다면 업데이트된 행의 수의 리턴해준다.)
문제의 코드
public interface MyRepository extends JpaRepository<MyClass, Integer> {
@Transactional
@Modifying
@Query(value="INSERT INTO MyClass(param1, param2) VALUES(?1, ?2)", nativeQuery=true)
MyClass mySave(int param1, String param2);
}
해결된 코드
public interface MyRepository extends JpaRepository<MyClass, Integer> {
@Transactional
@Modifying
@Query(value="INSERT INTO MyClass(param1, param2) VALUES(?1, ?2)", nativeQuery=true)
int mySave(int param1, String param2); // 또는 void 설정
}