[QueryDSL] BooleanExpression을 통한 동적쿼리

황세호·2021년 4월 28일
0

JPA

목록 보기
3/3

JPAQuery Factory

queryDSL은 JPAQueryFactory를 생성자 주입을 통해 상속/구현 구조로 사용하지 않아도 된다.

@RequiredArgsConstructor
@Repository
public class AcademyQueryRepository {
	private final JPAQueryFactory queryFactory;
    
    public List<Academy> findByName(String name){
    	return queryFactory.selectFrom(academy)
               .where(academy.name.eq(name))
               .fetch();
    }
}

BooleanExpression

일반적으로 동적쿼리를 사용할 때 BooleanBuilder를 사용한다. 사실상 이를 사용해도 큰 문제가 되는 것은 없으나 어떤 쿼리인지 바로 예측이 가지 않는다는 단점이 있다.

/* Boolean Builder */
@Override
public List<Academy> findBynamicQuery(String name, String address, String phoneNumber){
	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();
}
/* BooleanExpression */
@Override
public List<Academy> findBynamicQuery(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);
}

BooleanExpression은 null 반환 시 자동으로 조건절에서 제거 된다. (단, 모든 조건이 null이 발생 시 전체 엔티티를 불러오게 되므로 대장애가 발생할 수 있음)

profile
Developer

0개의 댓글