[QueryDSL]SQL의 substring과 Java의 substring

god1hyuk·2022년 9월 23일
1

Trouble Shooting

목록 보기
6/6
post-thumbnail

오늘의 트러블슈팅은 별 건 아니다.

약속이 있어 약속 시간 나가기 전, 급하게 팀원들과 함께 고민하며 코드를 작성하다 나갈 시간이 되어 마무리 못한 채 나가게 되었다.

약속에 다녀와 집으로 복귀한 후 해결하지 못했던 부분을 처리한 뒤 팀원들에게 전파하기 위해 메시지로 작성한 내용을 트러블 슈팅으로 작성한다.


여러분 저는 사뿐히 취해서 들어왔습니다…ㅎㅎ 우리 아까 이렇게까지 작성 하다 안된 채로 끝났죠?

  • Repository

  • ResponseDto

그런데 이러한 에러가 발생했죠.

Unsupported expression substring(concentration.startDate, 11, 13)

그 해결 안되던 substring 문제 해결 했어요. 그게 Query 자체의 문제가 아니라 생각해보니 애초에 startDate는 String 타입이었고 String 이기에 substring 메소드로 cutting 할 수 있었고 substring의 특성상 String 타입을 반환 하잖아요. 아까 제가 약속시간 때문에 마음이 급해서 간과 하지 않았나 싶네요 ㅋㅋ..

그래서 이렇게 ResponseDto의 생성자에서 startDate를 String으로는 받아오되 Integer로 변환 하게끔 했어요. 왜냐하면 endTime을 생성할 때 +1을 해야 하니까요. 이렇게요!

  • ResponseDto

그리고 SQL과 Java에서의 substring 문법의 차이점은 이렇습니다!

“2022-09-03 23”

일 때, “23”만 떼어 오고 싶다면 문법은 subString(target, beginIndex, endIndex)인데 시작점은 11 똑같아요 그런데 endIndex가 다른데

  • SQL

    • 단순히 생각해서 beginIndex인 11로 부터 이후 두 글자 이니까 12, 13 이렇게 해서 endIndex는 13이 됩니다.
  • Java

    • 저도 조금 의아하지만 beginIndex인 11로 부터 이후 두 글자 이니까 12, 13 이렇게 해서 endIndex는 13 같지만 그 다음 문자의 index인 14 이전 까지로 해서 11 ~ 14 사이의 문자라고 인식하는 듯 해요! 이렇게 생각하면 좀 이해가 쉽겠죠? 좀 더 쉽게 말씀 드리자면 SQL과 상대적으로 문법은
      • substring(target, beginIndex, endIndex - 1)이라 생각하시면 더 편히 이해 되지 않을까 싶어요!

그래서 QueryDSL에서 substring을 사용하실 때는 Java 문법에 맞춰 이렇게 작성 해주셔야 해요.

  • Repository

마지막으로! 그런데 DTO의 생성자를 만들고 그 생성자에 맞춰 fields를 맞춰 생성 해서 조회하고 DTO로 생성 하려면 Projections.fields가 아닌 Projections.constructor로 해야 하나봐요. Projection.fields로 DTO 생성을 하면 마찬가지로 같은 에러가 뜨더라구요.

Unsupported expression substring(concentration.startDate,11,14)

그래서 QueryDSL의 select절에서 Projections.constructor로 DTO를 생성했어요.

  • ResponseDto

Projections.constructor을 사용하니 우리가 원하는 데이터로 조회 되는 것을 확인할 수 있었어요!

정확한 이유는 아직 모르겠지만 더 알아 봐야겠어요. 근데 까먹을까봐 이렇게 기록해요.

아무튼 이렇게 우리 Query에 이래저래 사용해 보면서 많이 배워가는 것 같네요 아주 재미납니다:)

1개의 댓글

comment-user-thumbnail
2022년 9월 23일

열정맨

답글 달기