Spring/QueryDSL

동적 쿼리 - BooleanBuilder

느리지만 꾸준하게 2022. 4. 21. 01:33

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

  • BooleanBuilder
  • Where 다중 파라미터 사용

 

BooleanBuilder을 써보면 파라미터 두개를 넣었기 때문에 동적쿼리에서 둘 다 결과가 조회 되어야 한다.

@Test
public void dynamicQuery_BooleanBuilder() {

    // username이 1이고 나이가 10살인 사람을 찾으려 한다.
    String usernameParam = "member1";
    Integer ageParam = 10;

    List<Member> result = searchMember1(usernameParam, ageParam);
    assertThat(result.size()).isEqualTo(1);
    


}

// 파라미터의 값이 null이냐 아니냐에 따라서 동적으로 바뀌게 된다.
private List<Member> searchMember1(String usernameCond, Integer ageCond) {

    BooleanBuilder builder = new BooleanBuilder();
    // usernameCond 파라미터가 null이 아니면
    if (usernameCond != null) {
        // BooleanBuilder에다가 and 조건을 하나 넣어준다.
        // 그러면 member username이 equal이다.
        builder.and(member.username.eq(usernameCond));
    }

    // 이름이 둘다 있으면 빌더에 들어갈거고
    // username이 없고 age에 하나만 있으면 하나에만 들어갈 것이다.
    if (ageCond != null) {
        builder.and(member.age.eq(ageCond));
    }

    return queryFactory
            .selectFrom(member)
            // 빌더의 결과를 where에 넣어준다.
            .where(builder)
            .fetch();
}
// 결과 JPQL을 보면 파라미터 바인딩 두개가 된것을 볼 수 있다.

/* select
        member1 
    from
        Member member1 
    where
        member1.username = ?1 
        and member1.age = ?2
        
        // SQL도 마찬가지
        select
            member0_.id as id1_1_,
            member0_.age as age2_1_,
            member0_.team_id as team_id4_1_,
            member0_.username as username3_1_ 
        from
            member member0_ 
        where
            member0_.username=? 
            and member0_.age=?

 

 

만약 age가 null이면 usernameParam에만 들어가게 된다.

@Test
public void dynamicQuery_BooleanBuilder() {

    // username이 1이고 나이가 10살인 사람을 찾으려 한다.
    String usernameParam = "member1";
    Integer ageParam = null;

    List<Member> result = searchMember1(usernameParam, ageParam);
    assertThat(result.size()).isEqualTo(1);
    


}

 

username만 들어가고 age는 없다.

/* select
        member1 
    from
        Member member1 
    where
        member1.username = ?1
        
        select
            member0_.id as id1_1_,
            member0_.age as age2_1_,
            member0_.team_id as team_id4_1_,
            member0_.username as username3_1_ 
        from
            member member0_ 
        where
            member0_.username=?

 

즉 null이면 아래코드를 실행을 안한다.

// 이름이 둘다 있으면 빌더에 들어갈거고
// username이 없고 age에 하나만 있으면 하나에만 들어갈 것이다.
if (ageCond != null) {
    builder.and(member.age.eq(ageCond));
}

 

 

usernameCond가 필수다 가정하면 아래와 같이 QuerydslBasicTest에서 설정을 해줄수가 있다.

usernameCond

 

 

BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));라고 초기값을 넣어줄 수가 있다.

// 파라미터의 값이 null이냐 아니냐에 따라서 동적으로 바뀌게 된다.
private List<Member> searchMember1(String usernameCond, Integer ageCond) {

    BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));
    // usernameCond 파라미터가 null이 아니면
    if (usernameCond != null) {
        // BooleanBuilder에다가 and 조건을 하나 넣어준다.
        // 그러면 member username이 equal이다.
        builder.and(member.username.eq(usernameCond));
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 실전! Querydsl >

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...

www.inflearn.com