[QueryDSL] Dynamic Query

KMS·2022년 5월 10일
0

QueryDSL

목록 보기
8/8

QueryDSL를 이용해서 동적 쿼리를 생성하는 방식들을 보도록 하겠습니다.

Method #1: Boolean Builder

 	@Test
    void booleanBuilder() {
    
        String usernameParam = "MemberA";
        Integer ageParam = 25;

        //SELECT *FROM member WHERE username = "MemberA" AND age = 25;
        List<Member> result = searchMember1(usernameParam, ageParam);
        System.out.println("result.get(0) = " + result.get(0));

        Assertions.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 && ageParam >= 0) {
            builder.and(member.age.eq(ageParam));
        }

        return factory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }

BooleanBuilder를 통해서 파라미터 값이 존재 할때 조건에 WHERE 조건에 추가되도록 합니다. BooleanBuilder를 통해 로직에 따라서 WHERE에 추가할 조건들을 지정해 줄 수 있으며, WHERE에 해당 BooleanBuilder를 넣으면 조건에 맞에 WHERE문이 처리 됩니다.

Method #2: 조건 나열하기

	@Test
    void WhereParam() {

        String usernameParam = "MemberA";
        Integer ageParam = 25;

        List<Member> result = searchMember2(usernameParam, ageParam);
        System.out.println("result.get(0) = " + result.get(0));

        Assertions.assertThat(result.size()).isEqualTo(1);
    }
    
    private List<Member> searchMember2(String usernameParam, Integer ageParam) {
        return factory
                .selectFrom(member)
                .where(usernameEq(usernameParam), ageEq(ageParam)) //where(null)이면 무시 됨 -> ex: where(null, member.username.eq("MemberA")) 이면 null은 무시되고, username = "MemberA" 조건만 추가됨
                .fetch();
    }

    private BooleanExpression usernameEq(String usernameParam) {
        // NULL이 아니면 WHERE 조건 추가됨; NULL 이면 NULL을 그대로 반환
        return usernameParam != null ? member.username.eq(usernameParam) : null;
    }
    private BooleanExpression ageEq(Integer ageParam) {
        // NULL이 아니면 WHERE 조건 추가됨; NULL 이면 NULL을 그대로 반환
        return ageParam != null ? member.age.eq(ageParam) : null;
    }

QueryDSL에서 WHERE 문에 조건들을 추가할때 원하는 조건들을 그대로 나열해서 작성할 수 있는 특성을 이용한 방식입니다. 대신, where()에서 null 값은 무시되다는 특징을 이용해서 로직에 따라서 WHERE에 조건을 추가할지, 아니면 null을 추가할지 정해줍니다.

profile
Student at Sejong University Department of Software

0개의 댓글

관련 채용 정보