QueryDSL 동적 쿼리

JPA에서 동적 쿼리를 해결하는 방법

  1. 조건에 따라 문자열을 만들어 query문을 만들고 파라미터를 주는 방법
  2. JPA Criteria (JPA 표준 스펙)
  3. Query DSL를 통한 동적 쿼리 생성

 

Query DSL 동적 쿼리 만드는 방법

  1. BooleanBuilder
  2. Where 다중 파라미터 사용

 

1. BooleanBuilder

@Test
void dynamicQueryUsingBooleanBuilder(){

    String usernameParam = "member";
    Long ageParam = 10;
    
    List<Member> result = searchMember(usernameParam, ageParam);
    
    assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember(String usernameParam, Long ageParam) {

    BooleanBuilder builder = new BooleanBuilder();
    
    if(usernameParam != null) {
        builder.and(member.username.eq(usernameParam));
    }

    if(ageParam != null) {
        builder.and(member.age.eq(ageParam));
    }


    return jpaQueryFactory
            .selectFrom(member)
            .where(builder)
            .fetch();
}
  • 조건에 따라 builder.and() 메서드를 통해 구성합니다.

 

2. Where 다중 파라미터 사용

예제 1)

@Test
void dynamicQueryUsingWhereParameter(){

    String usernameParam = "member";
    Integer ageParam = 10;
    
    List<Member> result = searchMember(usernameParam, ageParam);
    
    assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember(String usernameCond, Integer ageCond) {
    return jpaQueryFactory
            .selectFrom(member)
            .where(usernameEq(usernameCond), ageEq(ageCond))
            .fetch();
}

private Predicate usernameEq(String usernameCond) {
    if(usernameCond == null) return null;

    return member.username.eq(usernameCond);
}

private Predicate ageEq(Integer ageCond) {
    if(ageCond == null) return null;

    return member.age.eq(ageCond);
}

 

예제 2) Where 파라미터 형식으로 조건 추상화 시킴

@Test
void dynamicQueryUsingWhereParameter(){

    String usernameParam = "member";
    Long ageParam = 10;
    
    List<Member> result = searchMember(usernameParam, ageParam);
    
    assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember(String usernameParam, Long ageParam) {
    return jpaQueryFactory
            .selectFrom(member)
            .where(allEq(usernameParam, ageParam))
            .fetch();
}

private BooleanExpression allEq(String usernameParam, Long ageParam) {
    return usernameEq1(usernameParam).and(ageEq(ageParam));
}

private BooleanExpression usernameEq1(String usernameCond) {
    if(usernameCond == null) return null;

    return member.username.eq(usernameCond);
}

private BooleanExpression ageEq1(Long ageCond) {
    if(ageCond == null) return null;

    return member.age.eq(ageCond);
}