ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] JPA update query error
    Spring 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 이 두 어노테이션을 꼭 붙여줘야 한다.

Designed by Tistory.