[Querydsl] BooleanExpression을 사용한 동적쿼리 작성

Querydsl에서 동적쿼리를 작성할 때 사용되는 BooleanExpression 클래스를 설명하겠습니다.

public abstract class BooleanExpression
extends LiteralExpression<Boolean>
implements Predicate

BooleanBuilder

동적쿼리를 작성할 때 사용하는 또다른 클래스 중 BooleanBuilder 클래스도 있습니다.

BooleanExpression과 BooleanBuilder 둘 중 어느것을 선택하든 성능상의 차이는 없습니다.

하지만 BooleanExpression은 어떤 의도의 쿼리문인지 한 번에 파악할 수 없다는 단점이 있습니다.

아래는 BooleanExpression사용하여 이름과 나이로 멤버를 찾아주는 메서드입니다.

BooleanBuilder 사용한 예제

	public List<Member> findMembers(String name, Integer age) {
        BooleanBuilder builder = new BooleanBuilder();

        if (!StringUtils.isEmpty(name)) {
            builder.and(QMember.member.name.eq(name));
        }
        if (age != null) {
            builder.and(QMember.member.age.eq(age));
        }

        return jpaQueryFactory
                .select(QMember.member)
                .from(QMember.member)
                .where(builder)
                .fetch();
    }

위 코드처럼 if문으로 조건을 비교해서 BooleanBuilder 객체에 값을 넣어주고

이 객체를 where에 넘어주면 조건문이 완성됩니다. 하지만 반복적인 if 문은 코드를 지저분하게 만들고 테이블의 필드수가 많다면 if문이 더 늘어날 것 입니다.

BooleanExpression

이러한 이유 때문에 BooleanBuilder보다는 BooleanExpression 사용이 권장됩니다.

BooleanExpression은 BooleanBuilder 와 다르게 메서드를 작성해서 조건을 판단합니다.

BooleanExpression사용한 예제

	public List<Member> matchingByAgeAndGender(Integer age, String gender) {
        return jpaQueryFactory
            .select(QMember.member)
            .from(QMember.member)
            .where(matching(age, gender))
            .fetch();
    }

    private BooleanExpression matching(int age, String gender) {
        if (gender == "MALE") {
            return QMember.member.age.loe(age);
        }
        return QMember.member.age.goe(age);
    }

BooleanExpression은 null을 리턴할 경우 해당 조건문은 where에서 제거가됩니다.

null이 반환되면 조건이 제거되고 아니면 자동으로 조건이 된다는 기능을 통해서

명시적인 쿼리문 작성이 가능하게됩니다.

좋은 웹페이지 즐겨찾기