-
[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이 반환되면 조건이 제거되고 아니면 자동으로 조건이 된다는 기능을 통해서
명시적인 쿼리문 작성이 가능하게됩니다.
'데이터베이스' 카테고리의 다른 글
[redis] Redis 서버 Master/Slave 설정하기 (windows10) (0) 2022.08.04 [redis] RDB 저장 실패시에도 write 명령 허용하기 (0) 2022.08.03 [JPA] JPA의 변경감지에 대해서 (0) 2022.07.11 [DB]데이터베이스 정규화(1NF, 2NF, 3NF) (0) 2022.07.02 [DB] 함수 종속성(functional dependency)이란? (0) 2022.05.11