[SpringBoot Querydsl : 동적 쿼리]

Han Gyul Kang·2022년 5월 5일
0

Inflern_Spring_Querydsl

목록 보기
4/7

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

  1. BooleanBuilder
  2. Where 다중 파라미터 사용

> 1. BooleanBuilder

객체 생성 시점에 생성자에 파라미터를 던지는 방식으로 기본 값을 지정할 수 있음
where절에 생성된 객체를 넣어주면 끝

> 2. Where 다중 파라미터 사용

where절에 null을 넣게되면 그냥 무시가 됨
where절에 들어가는 값으로 method를 던져 줌
다이나믹 쿼리를 위해 생성한 method들을 재활용할 수도 있음

다중 조건을 골라서 조립할 수도 있음
(메소드별로 명확한 명칭을 주면 쿼리 가독성도 높아짐)

중요 !
null 체크는 반드시 해야한다.

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

        // BooleanBuilder 사용
        List<Member> resultA = searchMemberWithBooleanBuilder(usernameParam, ageParam);
        // where절 다중 파라미터
        List<MemberDto> resultB = searchMemberWithMultiWhere(usernameParam, ageParam);
        assertThat(resultA.size()).isEqualTo(1);
        assertThat(resultB.size()).isEqualTo(1);

    }

    private List<Member> searchMemberWithBooleanBuilder(String usernameCond, Integer ageCond) {
        // 초기값 지정 가능
        // BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));
        BooleanBuilder builder = new BooleanBuilder();

        if(usernameCond != null) {
            builder.and(member.username.eq(usernameCond));
        }

        if(ageCond != null) {
            builder.and(member.age.eq(ageCond));
        }

        return jpaQueryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }
    private List<MemberDto> searchMemberWithMultiWhere(String usernameCond , Integer ageCond) {
        return jpaQueryFactory
                .select(new QMemberDto(member.username, member.age))
                .from(member)
                .where(usernameEq(usernameCond), ageEq(ageCond))
                //.where(allEq(usernameCond, ageCond))
                .fetch();
    }

    private BooleanExpression usernameEq(String usernameCond) {
        return usernameCond == null ? null : member.username.eq(usernameCond);
    }
    private BooleanExpression ageEq(Integer ageCond) {
        return ageCond == null ? null : member.age.eq(ageCond);
    }
    private BooleanExpression allEq(String usernameCond, Integer ageCond) {
        return usernameEq(usernameCond).and(ageEq(ageCond));
    }

> 예제

github:gang6607

profile
피아노 치는 개발자

0개의 댓글