인프런 커뮤니티 질문&답변

이한솔님의 프로필 이미지
이한솔

작성한 질문수

실전! Querydsl

PostgreSQL기반에서 LocalDateTime 비교문을 테스트시 제대로 동작을 안합니다.

작성

·

905

0

안녕하세요!

강의를 통해 배운 지식을 통해 영상및 텍스트 채팅 프로그램을 만들고 있습니다. 

여기서 안읽은 메세지를 구하기위해서 내가 마지막으로 해당 방에서 메세지를 읽은 시간을 저장하고 있고, 

그 시간보다 큰 시간대의 메세지를 조회해오는 쿼리입니다. 

첫번째 이미지에서 보시는 것처럼 message 에서 updateAt이 마지막 메세지를 읽은 시각(lastReadAt)보다 큰 메세지를 조회해오는 쿼리인데, 실제 실행쿼리문을 보면 아래 두번째 사진처럼 나옵니다. 

근데 이렇게 쿼리를 하게 될 경우 비교조건문이 제대로 동작을 하지 않습니다. 

저기서 '2020-08-07T07:12:09.602+0900' 뒤나 앞에 `::timestamp`를 붙혀줘서 캐스팅을 해줘야 제대로된 결과가

나옵니다.

이럴경우 queryDSL로 해결을 하려면 어떻게 해야할까요? 

답변 3

1

이한솔님의 프로필 이미지
이한솔
질문자

감사합니다.  lastReadAt.truncatedTo(ChronoUnit.SECONDS) 로 하니 해결이 되었습니다.

이상한게 분단위로 차이를 둬서 미묘한 시간차이가 아니라 분 단위 시간차이였는데... 무튼 이제 동작도 잘되고 쿼리 출력된거

뽑아서 실행시켜도 잘 나옵니다. 매번 도움 너무!!! 많이받고갑니다. 감사합니다! 

0

김영한님의 프로필 이미지
김영한
지식공유자

네 잘 해결되셔서 다행입니다^^!

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 한솔님

이렇게 쿼리를 하게 될 경우 비교조건문이 제대로 동작을 하지 않습니다라고 하셨는데요. -> 이 부분이 정확히 어떤 점 때문에 제대로 동작을 하지 않을까요?

오류가 발생하는지요?

단순히 결과가 나오지 않는 것인가요?

아니면 시간에 미묘한 차이가 발생하서 그런 것인지요?

밀리초 이하 부분이 조금 안맞는지요?

만약 시간이 미묘하게 안맞는 문제라면 자바에서 LocalDateTime에 등록이나 조회시에 적절하게 절삭해서 처리해주시면 됩니다.

다음 코드를 참고해주세요^^

LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS);

추가로 Querydsl도 결국 JPQL로 번역이 되는데요. 그래서 ::timestamp를 붙이는 것은 JPQL 문법에 어긋나서 불가능합니다. 대신에 사용자 정의 함수를 만들어서 함수를 등록해서 처리하는 것은 가능합니다. 이 부분은 JPA 사용자 함수로 검색해보시면 원하는 결과를 찾으실 수 있을거에요^^

도움이 되셨길 바래요.

이한솔님의 프로필 이미지
이한솔

작성한 질문수

질문하기