Querydsl - 동적 쿼리

HotFried·2024년 2월 26일
0

Querydsl

목록 보기
8/9

BooleanBuilder

BooleanBuilder를 통해 동적 쿼리를 처리한다.
파라미터로null이 반환되면 그 조건은 무시된다.

-> 만약 모든 조건의 파라미터가 null이라면 텅 빈 BooleanBuilder()where문에 들어간다.
이 경우 아래와 같이where문을 배제하고 쿼리를 날리기 때문에 모든 엔티티가 출력된다.

select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0
    @Test
    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) {
        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();
    }

Where 다중 파라미터

BooleanBuilder()와 달리 where문에 들어가는 조건을 메소드로 직접 구현한다.
마찬가지로 null을 반환할 경우 해당 조건이 없는 것으로 취급한다.

메서드를 다른 쿼리에서도 재사용할 수 있는 장점이 있다.

    @Test
    public void dynamicQuery_WhereParam() {
        String usernameParam = "member1";
        Integer ageParam = 10;

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

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

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

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

참고 :

실전! Querydsl

profile
꾸준하게

0개의 댓글