[Project] 2차 프로젝트 - JPQL Update한 객체를 바로 Return 받을 수 있을까 ?

김호정's avatar
Oct 25, 2024
[Project] 2차 프로젝트 - JPQL Update한 객체를 바로 Return 받을 수 있을까 ?

LendRepository.java

// 대여중인 도서 연장 @Modifying @Query("update Lend l SET l.extendStatus = true where l.user.id = :userId AND l.book.isbn13 = :isbn13") void mExtendLend(@Param("userId") Long userId, @Param("isbn13") String isbn13);
 
→ JPQL update 후 update 한 걸 service 단에서 Response DTO 에 담아서 return 해야해서
void 가 아닌 Lend 객체를 return 하려고 했는데 안됨.
 
챗 지피티한테 물어보니
 
💡
JPQL의 update 쿼리는 기본적으로 엔티티를 반환하지 않기 때문에, update 쿼리에서 바로 수정된 엔티티를 반환하는 것은 불가능합니다. JPQL에서 update는 단순히 영향을 받은 행의 수를 반환하며, 수정된 엔티티는 반환하지 않습니다.
하지만, update 쿼리 이후에 해당 Lend 엔티티를 다시 조회하여 반환할 수 있습니다. 즉, update 쿼리를 실행한 다음에 다시 한 번 select 쿼리를 사용하여 수정된 엔티티를 조회하는 방식으로 해결할 수 있습니다.
아래는 예시 코드입니다:
java 코드 복사 @Transactional @Modifying @Query("update Lend l SET l.extendStatus = true where l.user.id = :userId AND l.book.isbn13 = :isbn13") void updateExtendStatus(@Param("userId") Long userId, @Param("isbn13") String isbn13); @Query("select l from Lend l where l.user.id = :userId AND l.book.isbn13 = :isbn13") Lend findUpdatedLend(@Param("userId") Long userId, @Param("isbn13") String isbn13);
그리고 서비스 레이어에서 이를 다음과 같이 처리할 수 있습니다:
java 코드 복사 @Transactional public Lend extendLend(Long userId, String isbn13) { lendRepository.updateExtendStatus(userId, isbn13); // extendStatus를 업데이트 return lendRepository.findUpdatedLend(userId, isbn13); // 업데이트된 Lend 엔티티 반환 }

요약:

  • @Modifyingupdate 쿼리에서는 엔티티를 반환할 수 없으므로, 업데이트 후에 별도의 select 쿼리를 통해 수정된 데이터를 다시 조회해야 합니다.
  • 트랜잭션을 사용하여 updateselect가 동일한 트랜잭션 내에서 일어날 수 있도록 처리해야 합니다.
이 방식으로 update한 후에 수정된 Lend 엔티티를 반환할 수 있습니다.
 
JPQL에서 Update 쿼리는 데이터베이스의 값을 수정하기 위한 것이며,
update문은 기본적으로 변경된 객체를 반환하지 않는다고 한다.
그래서 JPQL에서는 update 쿼리를 수행한 후 select 쿼리를 통해 변경된 객체를 다시 조회해서 변경된 객체를 가져와야 한다.
 
Share article

keepgoing