자동 반납 기능에는 반납일에 해당하는 도서만 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();
위 쿼리는
returnDate
를 date
로 캐스팅하여 CURRENT_DATE
와 비교하도록 변경되었습니다. H2와 같은 내장 데이터베이스는 특정 함수나 쿼리 구문에서 차이가 있을 수 있으므로, 이러한 방식으로 쿼리를 조정하면 해결될 가능성이 큽니다.만약
CAST()
도 작동하지 않으면, returnDate
의 YEAR()
, MONTH()
, DAY()
함수들을 조합해서 직접 날짜를 비교하는 방법을 사용할 수도 있습니다.Share article