JPA count 확장 함수

바나나·2024년 12월 22일

kotlin

목록 보기
2/3

jpa 에서 쿼리 작성 후 해당 쿼리의 count 를 가져올때 동일한 조건을 또 써야되서 불편해서 추가한 확장 함수

// JPAQuery 확장 함수로, 페이징 처리를 하면서 전체 개수를 함께 조회하는 기능을 제공
fun <T> JPAQuery<T>.listWithTotalCountFetch(pageable: Pageable, countEntity: EntityPathBase<T>): ListWithTotalCount<T> {
    // 현재 쿼리를 복제하여 총 개수를 가져오는 쿼리 생성
    val query = this
    val totalCnt = query.clone()
        .select(countEntity, countEntity.countDistinct()) // countDistinct()를 사용하여 중복 없는 개수를 계산
        .fetchOne() // 결과를 단일 값으로 가져옴

    // 페이징 처리: Pageable 객체가 unpaged인 경우 전체 데이터를 가져오고, 그렇지 않으면 페이징 처리된 데이터를 가져옴
    val list = if (pageable.isUnpaged) {
        query.fetch() // 페이징 없이 전체 데이터를 조회
    } else {
        query.offset(pageable.offset) // 시작 위치 설정
            .limit(pageable.pageSize.toLong()) // 페이지 크기 설정
            .fetch() // 페이징된 데이터를 조회
    }

    // 조회된 데이터와 전체 개수를 포함하는 ListWithTotalCount 객체 반환
    return ListWithTotalCount(
        list,
        totalCnt?.get(1, Long::class.java)!!.toInt() // totalCnt의 두 번째 값(Long)을 Int로 변환하여 반환
    )
}

// 페이징 처리된 데이터와 전체 개수를 함께 담는 데이터 클래스
data class ListWithTotalCount<T>(
    val items: List<T>, // 조회된 데이터 리스트
    val totalCount: Int // 전체 데이터 개수
)

// 데이터 리스트와 마지막 키를 함께 담는 데이터 클래스 (Key 기반 페이징 용도)
data class ListWithLastKey<T>(
    val items: List<T>, // 조회된 데이터 리스트
    val lastKey: String?, // 마지막 키 (없으면 null)
)
profile
Java/Kotlin Spring 개발자 황재명입니다.

0개의 댓글