반응형
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 |
댓글