QueryDsl) and/or 처리 순서와 명시적으로 괄호 넣기

Photo by TJ Arnold on Unsplash

QueryDsl) and/or 처리 순서와 명시적으로 괄호 넣기

Oct 28, 2023·

1 min read

querydsl을 사용해서 ((A and B) or (C and D))를 표현하려고 했지만 쿼리 결과가 (A and B or C and D) 로 나와 문제 삼는 글들을 본 적이 있습니다. (몇 주 전의 저와, 같은 상태인 분들의 글이지요)

결론부터 말씀드리자면, 상관없습니다. SQL 처리에서 and가 or보다 우선순위가 높기 때문에 ((A and B) or (C and D)) 로 처리됩니다. > 참고글

e1.and(e2).or(e3.and(e4))//.or(e5.and(e6)) ....

글에 나와 있는 다른 케이스들도 한번 볼게요. 결과는 각 line마다 주석으로 달았습니다.

e1.or(e2).and(e3.or(e4))) // >>> (e1 or e2) and (e3 or e4)
e1.or(e2).and(e3)) // >>> (e1 or e2) and e3

정리하자면, 왼쪽에서 오른쪽으로 갈수록 더 상위 표현식이 되므로, subexpression으로 처리하고 싶다면 괄호 안에 넣어야 합니다.

하지만 괄호가 명시적으로 필요한 순간이 올 수도 있겠죠? 다음과 같이 WRAPPED operator를 이용하면 가능합니다.

Expressions.predicate(Ops.WRAPPED, e1.and(e2))
.or(Expressions.predicate(Ops.WRAPPED, e3.and(e4))) // >>> (e1 and e2) or (e3 and e4)

references