[Spring Boot] Querydsl 동적 쿼리 해결하는 방법

재피터노트북·2022년 11월 18일
1
post-thumbnail

동적 쿼리를 해결하는 두가지 방식

  • BooleanBuilder
  • BooleanExpression

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();
}        
  • BooleanBuilder 생성자를 생성한후, 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 조건에 null값은 무시됨.

Reference

김영한의 실전 Querydsl

profile
난 이 재 선

1개의 댓글

comment-user-thumbnail
2022년 11월 18일

어머~~ 좋은글 감사합니다 ^^ 쟈선님 잘 지내시죠?

답글 달기