작성
·
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())) 를 사용해서 처리했더니, 원하는 결과가 나왔습니다.