개발/Spring

[Spring] querydsl 에서 List<String> 타입 변수에 조건 넣기

hojak99 2020. 5. 15. 03:39

새벽 3시30분인데 지금 매우 화난다. 졸리니까 우선 간단히 쓰겠다.

코틀린을 기반으로 개발하고 있다.

DB 테이블에서는 json 타입의 필드에 단순히 [123, 321, 133] 와 같은 값을 넣고있다.
그리고 entity 에서는 해당 필드를 Set<String> 으로 타입을 정의해놓았다.

그리고 converter 를 직접 만들어서 json 을 잘 변환하도록 entity 클래스에 해당 필드에다가 converter 를 지정해주었다.
해당 필드의 이름이 numbers 라고 했을 때

querydsl 을 이용해 조건을 다음과 같이 걸어주었다.

numbers.contains("311")

근데 자꾸 hql 을 보니 해당 numbers 필드를 가지고 조인을 해버린다. 어이가 없다.

해당 필드는 조인할 수 없는데

hql 에서 ast 를 이용해 실제 native query 로 변환할 때 npe 가 뜬다.
디버깅 2시간동안 해서 보니

사진에

getWalter().addQuerySpaces(queryableCollection.getElementPersister().getQuerySpaces())

부분에서 npe 가 발생했다. 애초에 queryableCollection 이 null 인 상태에서 getElementPersister() 를 호출하니 나는 것 같았다.

collectionNode 에는 미친 자꾸 numbers 필드가 들어가는데 이게 타입이 primitive 로 지정 돼 있어서 from 이 안되니까 내부에서  getQueryableCollection() 호출 시 null 을 주는 듯 했다.

매우 화나 미치겠는데 querydsl 쪽에 문제인가,,? 애초에 hql 을 이상하게 주니까 그런건가?

그래서 우선 코틀린 Array 로 바꿔주니 된다.

우선 더 알아봐야겟다.

나처럼 개고생하는 사람들이 없으면 한다.

반응형