오늘의 트러블슈팅은 별 건 아니다.
약속이 있어 약속 시간 나가기 전, 급하게 팀원들과 함께 고민하며 코드를 작성하다 나갈 시간이 되어 마무리 못한 채 나가게 되었다.
약속에 다녀와 집으로 복귀한 후 해결하지 못했던 부분을 처리한 뒤 팀원들에게 전파하기 위해 메시지로 작성한 내용을 트러블 슈팅으로 작성한다.
여러분 저는 사뿐히 취해서 들어왔습니다…ㅎㅎ 우리 아까 이렇게까지 작성 하다 안된 채로 끝났죠?
그런데 이러한 에러가 발생했죠.
Unsupported expression substring(concentration.startDate, 11, 13)
그 해결 안되던 substring 문제 해결 했어요. 그게 Query 자체의 문제가 아니라 생각해보니 애초에 startDate는 String 타입이었고 String 이기에 substring 메소드로 cutting 할 수 있었고 substring의 특성상 String 타입을 반환 하잖아요. 아까 제가 약속시간 때문에 마음이 급해서 간과 하지 않았나 싶네요 ㅋㅋ..
그래서 이렇게 ResponseDto의 생성자에서 startDate를 String으로는 받아오되 Integer로 변환 하게끔 했어요. 왜냐하면 endTime을 생성할 때 +1을 해야 하니까요. 이렇게요!
그리고 SQL과 Java에서의 substring 문법의 차이점은 이렇습니다!
일 때, “23”만 떼어 오고 싶다면 문법은 subString(target, beginIndex, endIndex)인데 시작점은 11 똑같아요 그런데 endIndex가 다른데
SQL
Java
그래서 QueryDSL에서 substring을 사용하실 때는 Java 문법에 맞춰 이렇게 작성 해주셔야 해요.
마지막으로! 그런데 DTO의 생성자를 만들고 그 생성자에 맞춰 fields를 맞춰 생성 해서 조회하고 DTO로 생성 하려면 Projections.fields가 아닌 Projections.constructor로 해야 하나봐요. Projection.fields로 DTO 생성을 하면 마찬가지로 같은 에러가 뜨더라구요.
Unsupported expression substring(concentration.startDate,11,14)
그래서 QueryDSL의 select절에서 Projections.constructor로 DTO를 생성했어요.
Projections.constructor을 사용하니 우리가 원하는 데이터로 조회 되는 것을 확인할 수 있었어요!
정확한 이유는 아직 모르겠지만 더 알아 봐야겠어요. 근데 까먹을까봐 이렇게 기록해요.
아무튼 이렇게 우리 Query에 이래저래 사용해 보면서 많이 배워가는 것 같네요 아주 재미납니다:)
열정맨