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

김기황님의 프로필 이미지
김기황

작성한 질문수

실전! Querydsl

coalesce를 활용한 조건 질의에 대해서 궁금한게 있습니다

작성

·

939

0

안녕하세요 :) 열심히 찾아보고 찾아봤는데, 잘 모르겠어서 문의글 처음 올려봅니다.

coalesce를 활용하여 값이 없을때는 특정 값이 바인딩되도록 하여 비교하는 조건을 작성하려고 합니다.

오라클 쿼리에선 nvl이라는 것을 활용하여 다음과 같은 쿼리가 나오게 하려고 하는데요.

nvl(test_code, '01') = '01'

 

Expressions.asEnum(entity.testCode.coalesce(TestCode.DEFAULT)).eq(testCode.DEFAULT)

이렇게 조건을 걸었을때 

쿼리에선 다음과 같이 나옵니다

nvl(table.test_code, '<byte[]>') = '<byte[]>'

 

해당 엔티티에는 enum을 위해 converter도 설정되어 있는데 byte[]로 나오는게 이해되지 않습니다.

 

할 수 없이 enum을 string으로 변경하여 비교하도록 하니 쿼리는 동작합니다.

Expressions.asString(entity.testCode.stringValue()).coalesce('01').asString().eq('01')

아래 코드와 같이 쿼리가 나옵니다.

nvl(to_char(table.test_code), '01')='01' 

 

이미 varchar형태인 컬럼을 to_char로 변경해서 돌리는게 비효율적인 것 같습니다.

 

조언 부탁드립니다

답변 2

1

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

안녕하세요. 기황님

저도 이 부분은 잘 모르겠습니다.

혹시 아시는 분 있으면 도움 부탁드려요.

감사합니다.

0

저는 기황님 코드에서 도움을 받고서 해결했던 내용 공유드립니다.

 

entity.testCode.coalesce(TestCode.DEFAULT)

 to_char 이 호출되는게 불필요해보여서 해당 구문을 Expressions.asEnum 으로 감싸지 않고,

entity.testCode.coalesce(Expressions.asString(TestCode.DEFAULT.getCode())) 를 사용해서 처리했더니, 원하는 결과가 나왔습니다.

김기황님의 프로필 이미지
김기황

작성한 질문수

질문하기