[개발] : 효과적으로 QueryDsl 적용하기

@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);
	}
}

 

 

정렬 조건 추가

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]);
	}
}