목차
@Repository
@RequiredArgsConstructor
public class HubQueryRepository implements CustomHubRepository {
private final JPAQueryFactory queryFactory;
@Override
public Page<Hub> findDynamicQuery(HubSearchCriteria criteria, Pageable pageable) {
JPAQuery<Hub> query = queryFactory
.selectFrom(hub)
.where(
eqId(criteria.getId()),
eqName(criteria.getName()),
eqAddress(criteria.getAddress()),
eqLatitude(criteria.getLatitude()),
eqLongitude(criteria.getLongitude()),
eqManagerId(criteria.getManagerId()),
eqIsDeleted(criteria.getIsDeleted())
)
.orderBy(QueryDslUtils.getOrderSpecifiers(pageable.getSort(), Hub.class))
.offset(pageable.getOffset())
.limit(pageable.getPageSize());
List<Hub> results = query.fetch();
return new PageImpl<>(results, pageable, results.size());
}
private BooleanExpression eqId(UUID id) {
if (id == null) {
return null;
}
return hub.id.eq(id);
}
private BooleanExpression eqName(String name) {
if (StringUtils.isEmpty(name)) {
return null;
}
return hub.name.eq(name);
}
private BooleanExpression eqAddress(String address) {
if (StringUtils.isEmpty(address)) {
return null;
}
return hub.address.address.contains(address);
}
private BooleanExpression eqLatitude(Double latitude) {
if (latitude == null) {
return null;
}
return hub.address.latitude.eq(latitude);
}
private BooleanExpression eqLongitude(Double longitude) {
if (longitude == null) {
return null;
}
return hub.address.longitude.eq(longitude);
}
private BooleanExpression eqManagerId(Long managerId) {
if (managerId == null) {
return null;
}
return hub.managerId.eq(managerId);
}
private BooleanExpression eqIsDeleted(Boolean isDeleted) {
if (isDeleted == null) {
return null;
}
return hub.isDeleted.eq(isDeleted);
}
}
- [우아콘2020] 수십억건에서 QUERYDSL 사용하기를 참고해 위와 같이 조건 메서드를 분리하였습니다.
정렬 조건 추가
query의 orderBy
부분에서 사용되는 정렬 조건을 추가하기 위해, QueryDslUtils 클래스를 생성해 Pageable
에 저장된 Sort
객체의 정렬 조건을 반환하도록 만들었습니다.
public class QueryDslUtils {
public static OrderSpecifier<?>[] getOrderSpecifiers(Sort sort, Class<?> entityClass) {
PathBuilder<?> entityPath = new PathBuilder<>(entityClass, entityClass.getSimpleName().toLowerCase());
return sort.stream()
.map(order -> new OrderSpecifier<>(
order.isAscending() ? Order.ASC : Order.DESC,
entityPath.getString(order.getProperty())
)
)
.toList()
.toArray(new OrderSpecifier[0]);
}
}