개요

BooleanBuilder

@Test
void dynamicQuery_BooleanBuilder() {
    //given
    String userNameParam = "member1";
    Integer ageParam = 10;

    //when
    List<Member> result = searchMember(userNameParam, ageParam);

    //then
    assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember(String userNameParam, Integer 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();
}

Where 다중 파라미터 사용

@Test
void dynamicQuery_WhereParam() {
    //given
    String userNameParam = "member1";
    Integer ageParam = 10;

    //when
    List<Member> result = searchMember2(userNameParam, ageParam);

    //then
    assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember2(String userNameParam, Integer ageParam) {
    return jpaQueryFactory
            .selectFrom(member)
            .where(userNameEq(userNameParam), ageEq(ageParam)) // where 조건에 null 무시
            .fetch();
}

private BooleanExpression userNameEq(String userNameParam) {
    return userNameParam != null ? member.userName.eq(userNameParam) : null;
}

private BooleanExpression ageEq(Integer ageParam) {
    return ageParam != null ? member.age.eq(ageParam) : null;
}

조합 기능

private BooleanExpression allEq(String userNameParam, Integer ageParam) {
    return userNameEq(userNameParam).and(ageEq(ageParam));
}