[QueryDSL] 동적 쿼리
포스트
취소

[QueryDSL] 동적 쿼리

동적 쿼리

  • QueryDSL에서는 두 가지 방법을 통해 동적 쿼리를 생성할 수 있다.
  • 종류
    • BooleanBuilder
    • Where 다중 파라미터

BooleanBuilder

  • JPA Criteria API에서 제공하는 조건 생성 클래스를 활용하는 방법
  • 여러 개의 조건을 논리적으로 연결하여 동적 쿼리를 생성한다.
  • and(), or(), not() 등의 메소드를 통해 조건을 조합할 수 있다.
  • 장점
    • 다양한 조건을 자유롭게 조합할 수 있다.
    • 코드 작성이 간편하다.
  • 단점
    • 코드 가독성이 떨어질 수 있다.
    • 복잡한 조건을 처리하기 어려워질 수 있다.
@Test
public void dynamicQuery_BooleanBuilder() throws Exception {
    String usernameParam = "member1";
    Integer ageParam = 10;
    
    BooleanBuilder builder = getBooleanBuilderForTest(usernameParam, ageParam);
    List<Member> result = 
        queryFactory
        .selectFrom(member)
        .where(builder)
        .fetch();

    assertThat(result.size()).isEqualTo(1);
}
private BooleanBuilder getBooleanBuilderForTest(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 builder;
}

Where 다중 파라미터

  • JPA QueryDSL에서 제공하는 기본 기능을 활용하는 방법
  • where(Predicate... o) 메소드에 여러 개의 파라미터를 전달하여 동적 쿼리를 생성한다.
  • and(), or(), not() 등의 메소드를 통해 조건을 조합할 수 있다.
  • 장점
    • 코드 가독성이 높다.
    • 복잡한 조건을 처리하기 쉽다.
  • 단점
    • 코드 작성이 다소 번거롭다.
    • 지원하는 기능이 제한적일 수 있다.
@Test
public void dynamicQuery_WhereParam() throws Exception {
        String usernameParam = "member1";
        Integer ageParam = 10;
        
        List<Member> result = 
            queryFactory
            .selectFrom(member)
            .where(
                usernameEq(usernameParam), 
                ageEq(ageParam)
            )
            //.where(allEq(usernameCond, ageCond)) //=> 조합한 WhereParam을 사용하는 방법
            .fetch();
        
        assertThat(result.size()).isEqualTo(1);
}
//회원명 비교
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;
}
  • 조합해서 사용할 수 있다.
  • 대신 null 체크를 주의해서 처리해야 한다.
//회원명 비교 + 나이 비교
private BooleanExpression allEq(String usernameCond, Integer ageCond) {
    return usernameEq(usernameCond).and(ageEq(ageCond));
}

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.