QueryDSL에서 String 형이 동일한지 확인하는 코드에서 varchar(255)
로 변환하는 코드에서 mysql 구문 오류
가 발생합니다.
그 이유는 mysql에서 varchar의 경우에는 사용불가하여 cast로 변환해야하는데, 이는 사용자 쪽에서 명시해야합니다.
mysql에서 varchar를 사용할 수 없는데, 이로 형 변환이 되는 이유는 이는 주로 데이터베이스에서 데이터 타입을 명시하지 않고 캐스트를 수행할 때 자동으로 varchar로 처리되는 상황에서 나타납니다.
MySQL 에서는 형 변환을 위해 CAST
, CONVERT
가 사용할 수 있습니다.
형 변환할 수 있는 타입은 다음과 같이 있습니다.
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