ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Querydsl] BooleanExpression을 사용한 동적쿼리 작성
    데이터베이스 2022. 4. 15. 18:04

     

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

    public abstract class BooleanExpression
    extends LiteralExpression<Boolean>
    implements Predicate

     

    1. 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문이 더 늘어날 것 입니다.

     


     

    2. 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이 반환되면 조건이 제거되고 아니면 자동으로 조건이 된다는 기능을 통해서

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

Designed by Tistory.