문제
Hibernate: select r1_0.room_product_id,r1_0.created_at,r1_0.deleted_at,r1_0.room_id,r1_0.start_date,r1_0.stock,r1_0.updated_at from room_product r1_0 where r1_0.stock=?
2023-11-30T02:25:31.374Z ERROR 40009 --- [nio-8080-exec-1] c.a.global.error.GlobalExceptionHandler : query did not return a unique result: 27485
@Query("select rp from RoomProduct rp where rp.room.id = :roomId and rp.startDate =:startDate and rp.stock > 0")
List<RoomProduct> findByRoomIdAndStartDate(@Param("roomId") long roomId,
@Param("startDate") LocalDate startDate);
문제해석
- List<RoomProduct>에서 만약 해당 RoomProduct가 없다면, null이 select되는데 List는 null체크를 해주지 않으므로 NullPointException이 발생할 수 있다.
해결방안
@Query("select rp from RoomProduct rp where rp.room.id = :roomId and rp.startDate =:startDate and rp.stock > 0")
Optional<RoomProduct> findByRoomIdAndStartDate(@Param("roomId") long roomId,
@Param("startDate") LocalDate startDate);
- NullPointException을 해결할 수 있도록 Optional 객체로 반환하도록 한다.
RoomProduct roomProduct = roomProductRepository.findByRoomIdAndStartDate(
room_id, roomCartRequest.getStartDate()).orElseThrow(RoomProductNotFoundException::new);
- Optional 반환 타입이므로, orElseThrow를 통해, null일 경우 예외처리를 해줄 수 있도록 한다.
Uploaded by N2T