[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개의 댓글