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();
}
}
일반적으로 동적쿼리를 사용할 때 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이 발생 시 전체 엔티티를 불러오게 되므로 대장애가 발생할 수 있음)