본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/QueryDSL

QueryDSL 공부 6 - 동적쿼리 (booleanBuilder)

반응형

 

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

 

- BooleanBuilder

 

-where절에 조건으로 사용

 

 

1. BooleanBuilder 를 통한 동적 쿼리 

 

   private List<Member> searchMember1(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 qf
                .selectFrom(member)
                .where(builder)
                .fetch();
    }

 

BooleanBuilder를 사용하여 StringBulider 처럼 쿼리를 조건별로 쿼리를 쌓아서 동적 쿼리로 쓸 수 있다 .

코드가 조금 지저분한 단점이 있지만 사용하기 편리하다 . 

 

 

2.where 절 조건을 통한 동적 쿼리 

 

    //where 문에서 동적쿼리
    @Test
    public void dynamicQuery_WhereParam(){
        String usernameParam = "member1";
        Integer ageParam = 10 ;

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


    }

    //where에 null이 들어가면 무시된다 .
    //때문에 동적쿼리가 가능하다 .
    //메서드를 다른 쿼리에서 재활용 할 수도 있다 .
    //쿼리 자체에 가독성이 높아진다 .
    //BooleanExpression에서 메서드끼리 조합이 가능하다
    private List<Member> searchMember2(String usernameCond, Integer ageCond) {
        return qf
                .selectFrom(member)
                .where(usernameEq(usernameCond),ageEq(ageCond))
                .fetch();
    }

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

    private BooleanExpression usernameEq(String usernameCond) {
        return usernameCond != null ? member.username.eq(usernameCond) : null;
    }

    private BooleanExpression allEq(String usernameCond, Integer ageCond){
        return usernameEq(usernameCond).and(ageEq(ageCond));
    }

 

조건별로 메서드를 따로 빼서 where 절에 넣는다 , 만약 메서드에서 where 절로 null이 반환되면  where 절에서는 해당 조건이 무시 되기 때문에 동적쿼리가 가능하다 . 

 

조건 메서드들은 다른 곳에서 재사용이 가능하고 BooleanExpression 으로 반환하면 메서드들 끼리 조합도 가능하다는게 큰 장점이다. ( allEq() 처럼 조합이 가능함 )

 

booleanBuilder 보다는 where 절 동적쿼리를 활용하자.

반응형