상세 컨텐츠

본문 제목

[SPRING] Querydsl | 동적쿼리

JAVA/기본 & 강의복습

by ranlan 2021. 5. 17. 01:38

본문

728x90

여러 조건이 있는 동적 쿼리

String usernameParam = "member1";
Integer ageParam = 10;

List<Member> result = searchMember(usernameParam, ageParam);

 

1) BooleanBuilder 사용

private List<Member> searchMember(String usernameCond, Integer ageCond) {

        BooleanBuilder builder = new BooleanBuilder();
//        BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));

        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();
    }

BooleanBuilder 인자로 초기 조건(꼭 지켜야하는 조건) 설정이 가능하다. 조건이 맞으면 AND 쿼리를 생성한다.

 

2) WHERE 다중 파라미터

import com.querydsl.core.types.dsl.BooleanExpression;

private List<Member> searchMember(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) {
    return ageCond != null ? member.age.eq(ageCond) : null;
}

where절에 null일 경우 무시한다.

검색 조건 조립하여 새로운 조건 메서드 생성이 가능 하다.

private BooleanExpression allEq(String usernameCond, Integer ageCond) {
    return usernameEq(usernameCond).and(ageEq(ageCond));
}

조건 조립 시 Predicate가 아닌 BooleanExpression 반환값 사용

 

실행 결과

select	member1
from	Member member1
where	member1.username = ?1
and	member1.age = ?2

age가 null 인 경우 실행 결과

select	member1
from	Member member1
where	member1.username = ?1
728x90

관련글 더보기

댓글 영역