[Project] 2차 프로젝트 - 반납일에 해당하는 도서 select 하기

김호정's avatar
Oct 25, 2024
[Project] 2차 프로젝트 - 반납일에 해당하는 도서 select 하기
 
자동 반납 기능에는 반납일에 해당하는 도서만 List<Lend> 에 담기도록 쿼리를 작성해야 한다.
 
 
@Query("SELECT l FROM Lend l WHERE FUNCTION('DAYOFMONTH', l.returnDate) = FUNCTION('DAYOFMONTH', CURRENT_TIMESTAMP) AND l.returnStatus = false") List<Lend> mFindAllByReturnDateAndReturnStatusFalse();
→ 처음에 day만 비교하는 쿼리를 사용했는데, 그러니 오늘이 10월 16일 이면
9월 16일, 11월 16일 것도 조회되는 대참사가….
 
→ 12시에 오늘 “일(day)”로 바뀌었을 때 날짜를 비교하는 것 까지는 맞지만
“연-월-일”을 모두 비교해야지 정확한 결과가 나온다.
 
@Query("SELECT l FROM Lend l WHERE CAST(l.returnDate AS date) = CURRENT_DATE AND l.returnStatus = false") List<Lend> mFindAllByReturnDateAndReturnStatusFalse();
→ “연-월-일”을 모두 비교해서 일치하는 것만 조회하도록 수정하니 정확한 결과가 나온다.
 
@Query("SELECT l FROM Lend l WHERE FUNCTION('DATE', l.returnDate) = CURRENT_DATE AND l.returnStatus = false") List<Lend> mFindAllByReturnDateAndReturnStatusFalse();
중간에 아래와 같이 쿼리를 작성해서 실행해보았는데,
 
H2는 DATE() 함수 대신 다른 방식을 사용해야 한다고 해서
CAST() 또는 TRUNC() 함수로 날짜 부분만 추출하도록 했다.
 
 
💡
이 에러는 H2 데이터베이스에서 DATE() 함수가 지원되지 않아서 발생한 것입니다. H2는 DATE() 함수 대신 다른 방식을 사용해야 하며, returnDate 필드를 날짜 부분만 추출하여 비교하는 방법을 사용할 수 있습니다.

해결 방법:

H2에서는 CAST() 또는 TRUNC() 함수로 날짜 부분만 추출할 수 있습니다. CAST()를 사용하여 returnDate의 날짜 부분만 가져오는 방식으로 쿼리를 수정해 보세요:
java 코드 복사 @Query("SELECT l FROM Lend l WHERE CAST(l.returnDate AS date) = CURRENT_DATE AND l.returnStatus = false") List<Lend> mFindAllByReturnDateAndReturnStatusFalse();
위 쿼리는 returnDatedate로 캐스팅하여 CURRENT_DATE와 비교하도록 변경되었습니다. H2와 같은 내장 데이터베이스는 특정 함수나 쿼리 구문에서 차이가 있을 수 있으므로, 이러한 방식으로 쿼리를 조정하면 해결될 가능성이 큽니다.
만약 CAST()도 작동하지 않으면, returnDateYEAR(), MONTH(), DAY() 함수들을 조합해서 직접 날짜를 비교하는 방법을 사용할 수도 있습니다.
 
Share article

keepgoing