[ QueryDSL ] eq에서 형 변환 시 cast varchar(255) 예외가 발생할 때

5tr1ker·2024년 8월 3일
0

Spring

목록 보기
15/16
post-thumbnail

발생 원인

QueryDSL에서 String 형이 동일한지 확인하는 코드에서 varchar(255) 로 변환하는 코드에서 mysql 구문 오류 가 발생합니다.
그 이유는 mysql에서 varchar의 경우에는 사용불가하여 cast로 변환해야하는데, 이는 사용자 쪽에서 명시해야합니다.

mysql에서 varchar를 사용할 수 없는데, 이로 형 변환이 되는 이유는 이는 주로 데이터베이스에서 데이터 타입을 명시하지 않고 캐스트를 수행할 때 자동으로 varchar로 처리되는 상황에서 나타납니다.

해결 방안

MySQL 에서는 형 변환을 위해 CAST , CONVERT 가 사용할 수 있습니다.

형 변환할 수 있는 타입은 다음과 같이 있습니다.

  • BINARY[(N)]
  • CHAR[(N)][charset_info]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • JSON
  • NCHAR[(N)]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

QueryDSL 에서는 VARCHAR로 하지만 MySQL 에서는 VARCHAR로 형 변환에 예외가 발생할 경우 CHAR 로 형 변환을 명시해줄 필요가 있습니다 이때 Expressions.stringTemplate 를 사용해서 형 변환을 해줄 수 있습니다.

기존 QueryDSL에서는 다음과 같은 코드로 변환이 됩니다. CAST(int_column AS VARCHAR(255))
우리는 다음과 같은 코드로 Query 를 변경해줄 수 있습니다.
StringTemplate castExpression = Expressions.stringTemplate("CONVERT({0}, CHAR(255))", email);
그러면 쿼리는 다음과 같이 변경됩니다. CONVERT('email', CHAR(255)) 다음과 같은 코드는 QueryDSL에서 where 절에서 다음과 같이 작성할 수 있습니다.

castExpression.eq(qAccount.email)

이때 castExpression에 들어간 데이터는 인자로 전달받은 변수이며, eq() 함수 안에 들어간 데이터는 Q파일에 명시된 변수입니다.

참고

참고 블로그 1 : https://fishcoding.tistory.com/71
참고 블로그 2 : https://hoehen-flug.tistory.com/27
참고 블로그 3 : https://bramhyun.tistory.com/56

profile
https://github.com/5tr1ker

0개의 댓글