Programming/Querydsl

Querydsl - 중급 문법 (2) 동적 쿼리

잇(IT) 2023. 7. 28. 16:11
- 동적 쿼리

1. BooleanBuilder 사용

2. where 다중 파라미터 사용


1. BooleanBuilder

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

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

    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 queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }

1. 둘 다 null이 아닌경우

- 검색 조건이 둘 다 null이 아닌 경우 정상적으로 where문을 통해 조건 쿼리를 날리는 것을 확인 할 수 있다.

 

2. 검색 조건 중 null이 있을 경우

- 검색 조건 중 age가 null인 경우 age 관련 쿼리 없이 where 조건 쿼리를 실행하는 것을 확인 할 수 있다.

 

- BooleanBuilder 객체를 생성한다. 이 객체는 생성된 조건들을 AND나 OR로 연결하기 위한 기본적인 객체다.

- if문을 통해 조건에 부합하면 and를 통해 builder에 AND 연산을 추가한다.

- and, or을 사용하여 작성 할 수 있다. queryFactory에 builder 객체를 넣게 되면 위에서 처리한 조건들이 적용되서 쿼리를 날리게 된다.


2. Where 다중 파라미터 사용

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

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

    private List<Member> searchMember2(String usernameParam, Integer ageParam) {
        return queryFactory
                .selectFrom(member)
                .where(usernameEq(usernameParam), ageEq(ageParam))
//                .where(allEq(usernameParam, ageParam))
                .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));
    }

1. 둘 다 null이 아닌경우

2. 검색 조건 중 null이 있을 경우

- 쿼리 결과는 Booleanbuilder와 동일한 결과를 보여준다.

 

- where에 메서드를 작성하여 동적 쿼리를 작성하는 방법이다.

- 메서드의 반환 타입은 BooleanExpression으로 하는 것을 권장한다.

- where절의 메서드의 반환값이 null일 경우 해당 메서드는 무시된다.

- 메서드를 사용하여 동적 쿼리를 작성할 경우 메서드를 다른 쿼리에서도 재활용 할 수 있다는 장점이 있고, 쿼리 자체의 가독성이 높아진다.

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 김영한(실전! Querydsl)

728x90