[Query DSL] 동적 쿼리 - BooleanBuilder , Where 다중 사

컴공생의 코딩 일기·2023년 2월 6일
0

Query DSL

목록 보기
4/6
post-thumbnail

동적 쿼리 - BooleanBuilder

  • 동적 쿼리를 해결하는 두가지 방식
    • BooleanBuilder
    • Where 다중 파라미터 사용

BooleanBuilder 사용 예제

@Test
public void 동적쿼리_BooleanBuilder() throws Exception {
 String usernameParam = "member1";
 Integer ageParam = 10;
 List<Member> result = searchMember1(usernameParam, ageParam);
 Assertions.assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember1(String usernameCond, Integer ageCond) {
 BooleanBuilder builder = new BooleanBuilder();
 if (usernameCond != null) {
 builder.and(member.username.eq(usernameCond));
 }
 if (ageCond != null) {
 builder.and(member.age.eq(ageCond));
 }
 return queryFactory
 .selectFrom(member)
 .where(builder)
 .fetch();
}

usernameCondageCond 에 값이 모두 존재한다면 둘 다 조회가 되고 하나만 존재한다면 하나만 조회된다.

동적 쿼리 - Where 다중 파라미터 사용 (BooleanExpression)

@Test
public void 동적쿼리_WhereParam() throws Exception {
 String usernameParam = "member1";
 Integer ageParam = 10;
 List<Member> result = searchMember2(usernameParam, ageParam);
 Assertions.assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember2(String usernameCond, Integer ageCond) {
 return queryFactory
 .selectFrom(member)
 .where(usernameEq(usernameCond), ageEq(ageCond))
 .fetch();
}
private BooleanExpression usernameEq(String usernameCond) {
 return usernameCond != null ? member.username.eq(usernameCond) : null;
}
private BooleanExpression ageEq(Integer ageCond) {
 return ageCond != null ? member.age.eq(ageCond) : null;
}

where 다중 파라미터 사용시 장점

  • where 조건에 null 값은 무시된다.
  • 메서드를 다른 쿼리에서도 재활용 할 수 있다.
  • 쿼리 자체의 가독성이 높아진다.
  • 조합 가능하다.
// null 체크는 주의해서 처리해야한다.
private BooleanExpression allEq(String usernameCond, Integer ageCond) {
 return usernameEq(usernameCond).and(ageEq(ageCond));
}
profile
더 좋은 개발자가 되기위한 과정

0개의 댓글