ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Querydsl - BooleanBuilder 이용한 동적 쿼리
    Spring/Querydsl 2022. 3. 25. 14:19
    728x90
    반응형

     

    BooleanBuilder 사용한 동적 쿼리

     

     BooleanBuilder를 사용하면 동적 쿼리를 사용할 수 있다. where 절에서 사용하는 데이터 값이 null 일 경우 조건을 제외시킬 수 있어 동적 쿼리를 만들기 편리하다.

     

    @Test
    @DisplayName("BooleanBuilder를 이용한 동적쿼리")
    public void dynamicQuery_BooleanBuilder() {
        String usernameParam = "member1";
        Integer ageParam = 10;
    
        List<Member> result = searchMember1(usernameParam, ageParam);
        assertThat(result.size()).isEqualTo(1);
    }
    
    private List<Member> searchMember1(String usernameCond, Integer ageCond) {
    
    //  여기서 중요한 것은 넘어온 파라미터 값이 null이면 검색 조건에 안들어가는 것
    //  필수 값일 경우 BooleanBuilder에 파라미터로 넘겨주면 된다.
        BooleanBuilder builder = new BooleanBuilder();
        if (usernameCond != null) {
            builder.and(member.username.eq(usernameCond));
        }
        if (ageCond != null) {
            builder.and(member.age.eq(ageCond));
        }
    
        return queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }
        /* select
            member1 
        from
            Member member1 
        where
            member1.username = ?1 
            and member1.age = ?2 */ select
                member0_.member_id as member_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=?

     

     위 쿼리를 보면 usernameCond와 ageCond 값이 null 아니므로 정상적으로 where조건에 포함된 것을 볼 수 있다. 만약 null일 경우에는 where 조건에 포함되지 않는다.

        @Test
        @DisplayName("BooleanBuilder를 이용한 동적쿼리")
        public void dynamicQuery_BooleanBuilder() {
            String usernameParam = "member1";
            Integer ageParam = null;		// null로 변경
    
            List<Member> result = searchMember1(usernameParam, ageParam);
            assertThat(result.size()).isEqualTo(1);
        }
        /* select
            member1 
        from
            Member member1 
        where
            member1.username = ?1 */ select
                member0_.member_id as member_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=?

     

     위 쿼리를 보면 ageCond가 null이므로 검색조건에서 제외된 것을 볼 수 있다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형

    댓글

Designed by Tistory.