Programing/Spring Boot

코틀린 Querydsl Pageble Sort 동적 정렬 쉽게 사용하기 + 유틸화

딩코딩 2023. 7. 13. 10:53

코틀린에서 Querydsl을 이용하여 pageble객체를 받아 동적으로 정렬하기 위해서 유틸리티 하나를 생성한다.

open class QuerydslUtils {
    fun <T, Q : EntityPath<*>> JPAQuery<T>.withPageable(pageable: Pageable, entityPath: Q): JPAQuery<T> {
        val query = this.limit(pageable.pageSize.toLong()).offset(pageable.offset)
        for (o in pageable.sort) {
            val pathBuilder = PathBuilder<Any?>(entityPath.type, entityPath.metadata)
            
            query.orderBy(
                OrderSpecifier(
                    if (o.isAscending) Order.ASC else Order.DESC,
                    pathBuilder.get(o.property) as Expression<out Comparable<*>>
                )
            )
        }
        return query
    }
}

 

사용하고자 하는  Querydsl 코드에서 QuerysUtils를 상속받고

.withPageable로 사용하면된다. 인자로 pageable, Q객체의 엔티티를 보내주자

import com.exemple.entity.QAcademy.academy
class academyDaoCustomImpl : AcademyDaoCustom, QuerydslUtils() {
	override fun findBySearchPage(condition: SearchCondition, pageable: Pageable): Page<Academy> {
        
            val query = queryFactory.selectFrom(academy)
                    .where(
                        academyNameContains(condition.academyName),
                        academyPlanEQ(condition.plan),
                        dateBetween(condition.startDate,condition.endDate),
                        academy.deleted.isFalse,
                    )
                    .withPageable(pageable, academy)

            val content = query.fetch()

            //이하 카운트쿼리 분리 생략

     }
 }

이로써 여러곳에서 쉽게 pageable을 사용할 수 있다.

 

참고: https://ttl-blog.tistory.com/901