-
[Spring] JPA update query errorSpring 2021. 10. 14. 10:07
이슈
@Query(value = "UPDATE DRIVE_MST SET DEL_YN ='y' WHERE LOGICAl_ID = :logicalId", nativeQuery = true) public void deleteMeta(@Param("logicalId") String logicalId)
-> 다음과 같이 업데이트 하는 nativeQuery를 넣고 메서드를 호출했다.
-> 업데이트 쿼리는 result set이 반환되지 않기 때문에 반환 타입을 void로 하였다.
-> 다음과 같은 에러가 발생하였다.
09:52 WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: -90607, SQLState: JDBC-90607:ERRJD 09:52 ERROR o.h.e.jdbc.spi.SqlExceptionHelper - JDBC-90607:No result set was returned. 09:52 ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not execute query; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query] with root cause java.sql.SQLException: JDBC-90607:No result set was returned.
반환 타입을 void로 하였는데 왜 return 이 없다는 오류가 나는 거지?
-> 반환타입없이 수정만 하고 반환이 없다는 것을 나타내기 위해 @Modifying 이라는 어노테이션을 붙여 주었다.
그랬더니 이번에는 transaction 관련해서 다음과 같은 에러가 발생하였다.
10:00 ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query] with root cause javax.persistence.TransactionRequiredException: Executing an update/delete query
JPA는 쿼리 호출이 발생하면 바로 쿼리를 날리고 commit을 하는 것이 아니라 쿼리문을 모아놨다가 한번에 flush 하는 방식으로 쿼리를 효율적으로 처리한다. 하지만 업데이트 쿼리는 바로바로 commit을 해줘야 하기 때문에 @Transactional이라는 어노테이션을 붙여야 한다.
결론
@Transactional @Modifying @Query(value = "UPDATE DRIVE_MST SET DEL_YN ='y' WHERE LOGICAl_ID = :logicalId", nativeQuery = true) public void deleteMeta(@Param("logicalId") String logicalId)
JPA에서 업데이트 쿼리를 날려주기 위해서는 @Transactional, @Modifying 이 두 어노테이션을 꼭 붙여줘야 한다.
'Spring' 카테고리의 다른 글