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