[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이 반환되면 조건이 제거되고 아니면 자동으로 조건이 된다는 기능을 통해서
명시적인 쿼리문 작성이 가능하게됩니다.
Author And Source
이 문제에 관하여([Querydsl] BooleanExpression을 사용한 동적쿼리 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@enter/Querydsl-BooleanExpression을-사용한-동적쿼리-작성저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)