QueryDSL 기반 정렬 처리

@Override
public Page<Tuple> sortedProducts(PageRequestDTO pageRequestDTO, Pageable pageable) {
    BooleanExpression expression = qProduct.subCategory.subCateNo.eq(subCateNo)
            .and(qProduct.state.eq("판매"));

    OrderSpecifier<?> orderSpecifier = switch (sortType) {
        case "lowPrice"   -> discountedPrice.asc();
        case "highPrice"  -> discountedPrice.desc();
        case "highRating" -> qProduct.ratingAvg.desc();
        case "manyReviews"-> qProduct.reviewCount.desc();
        default           -> qProduct.regDate.desc();
    };

    List<Tuple> tupleList = queryFactory
            .select(qProduct, qSeller.company, qSeller.rank, qProductImage.sNameList)
            .from(qProduct)
            .join(qSeller).on(qProduct.seller.sno.eq(qSeller.sno))
            .leftJoin(qProductImage).on(qProductImage.product.eq(qProduct))
            .where(expression)
            .offset(pageable.getOffset())
            .limit(pageable.getPageSize())
            .orderBy(orderSpecifier)
            .fetch();

    long total = queryFactory.select(qProduct.count()).from(qProduct)
            .where(expression).fetchOne();

    return new PageImpl<>(tupleList, pageable, total);
}

기술 설명