본문 바로가기
IT/Java

querydsl 동적 쿼리 관련

by 성준하이 2022. 8. 21.
반응형

JPA 를 사용하며 좀더 유연한 쿼리를 위해 querydsl을 선택을 많이 하곤 하는데,

querydsl 을 사용하는 이유 중 또 하나는 동적 쿼리 이다.

 

그중 조건문을 걸기 위한 동적 쿼리에 대해서 특히 많이 사용이 된다.

 

그중 많이 사용되는 BooleanBuilder, BooleanExpression을 다뤄볼 것이다.

 

사용법은 다음과 같다.

BooleanBuilder
    BooleanBuilder builder = new BooleanBuilder();
 
    if (!StringUtils.isEmpty(name)) {
        builder.and(academy.name.eq(name));
    }
    if (!StringUtils.isEmpty(address)) {
        builder.and(academy.address.eq(address));
    }
    if (!StringUtils.isEmpty(phoneNumber)) {
        builder.and(academy.phoneNumber.eq(phoneNumber));
    }
 
    return queryFactory
            .selectFrom(academy)
            .where(builder)
            .fetch();

하지만 이렇게 사용되는건 mybatis처럼 조건문을 걸어서 추가를 하는 방식이다.

 

좀더 직관적으로 보이기 위해서는 BooleanExpression을 사용할수도 있다.

방법은 다음과 같다.

    @Override
    public List<Academy> findDynamicQueryAdvance(String name, String address, String phoneNumber) {
        return queryFactory
                .selectFrom(academy)
                .where(eqName(name),
                        eqAddress(address),
                        eqPhoneNumber(phoneNumber))
                .fetch();
    }
 
    private BooleanExpression eqName(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return academy.name.eq(name);
    }
 
    private BooleanExpression eqAddress(String address) {
        if (StringUtils.isEmpty(address)) {
            return null;
        }
        return academy.address.eq(address);
    }
 
    private BooleanExpression eqPhoneNumber(String phoneNumber) {
        if (StringUtils.isEmpty(phoneNumber)) {
            return null;
        }
        return academy.phoneNumber.eq(phoneNumber);
    }

 

반응형

'IT > Java' 카테고리의 다른 글

Optional 이란?  (51) 2022.08.23
@Valid annotation (BindingResult, Error)(유효성 검사)  (48) 2022.08.22
jackson annotation 관련  (41) 2022.08.20
Entity, DTO, VO 차이  (47) 2022.08.18
JPA, Hibernate, Spring Data JPA  (48) 2022.08.17

댓글