본문 바로가기
JPA

[querydsl] in절 동적 쿼리 작성 주의점(1=2)

by hseong 2023. 4. 3.

프로젝트를 진행하며 querydsl로 동적 쿼리를 처리해주고 있다.

태그와 같은 기능을 위해서 여러개의 태그를 가진 게시글을 검색해주기 위한 in 절을 사용하고 있다. 이때 제대로 처리를 해주지 않아 문제가 발생했다.

 

    private BooleanExpression studyIdIn(List<Long> studyIds) {
        return studyIds != null ? postStudy.study.id.in(studyIds) : null;
    }

태그를 위한 검색 조건 중 studyIds라는 필드가 있는데 이것이 null 인 경우에는 위 메서드에 의해서 null 값이 반환되어 where 절에서 무시된다.

테스트시에도 항상 studyIds 필드에는 null을 지정하거나, id들을 지정해서 넣었기 때문에 문제가 발생하지 않았다.

 

그러나 studyIds필드가 null이 아닌 size가 0인 리스트가 들어오는 경우 in절이 무시되지 않고 1=2 라는 조건으로 치환되면서 아무런 결과값을 반환하지 않는다.

    private BooleanExpression studyIdIn(List<Long> studyIds) {
        return studyIds != null && !studyIds.isEmpty() ? postStudy.study.id.in(studyIds) : null;
    }

따라서 in 절을 검색 조건으로 사용할 때는 null 체크 후에 리스트가 비어있는지도 확인하도록 작성하여야 한다.