UserController.kt
@GetMapping("/paged")
fun getUsersWithPaging(pageable: Pageable, @RequestParam searchVal: String?): Page<UserDto> {
// 페이징된 사용자 목록 반환
return querydslUserService.getUsersWithPaging(pageable, searchVal)
}
-> 지난번에 추가한 controller 해당 api에 @RequestParam으로 검색어를 받는부분을 추가
QuerydslUserService.kt
package com.contact.management.service
import com.contact.management.dto.UserDto
import com.contact.management.entity.QUser
import com.contact.management.repository.UserRepository
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.data.domain.Page
import org.springframework.data.domain.PageImpl
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@Service
@Transactional
class QuerydslUserService(
private val queryFactory: JPAQueryFactory
) {
@Transactional(readOnly = true)
fun getUsersWithPaging(pageable: Pageable, searchVal: String?): Page<UserDto> {
val qUser = QUser.user
var predicate: BooleanExpression = qUser.isNotNull
searchVal?.let {
predicate = predicate.and(qUser.name.containsIgnoreCase(searchVal))
}
// JPAQueryFactory를 사용하여 쿼리 작성
val query = queryFactory
.selectFrom(qUser)
.where(predicate)
.orderBy(qUser.id.asc()) // ID 기준으로 오름차순 정렬 (필요에 따라 변경 가능)
// 실제 데이터 조회
val users = query
.offset(pageable.offset) // 페이지의 시작 인덱스
.limit(pageable.pageSize.toLong()) // 페이지 크기
.fetch() // 결과 가져오기
// 총 개수를 구하는 쿼리 작성 (countQuery)
val countQuery = queryFactory
.select(qUser.count()) // 총 개수 계산
.from(qUser)
.where(predicate)
val total = countQuery.fetchOne() ?: 0L // fetchOne()으로 단일 값 가져오기
// Page 객체로 반환
val userDtos = users.map { UserDto(it.id, it.name, it.email) }
return PageImpl(userDtos, pageable, total)
}
}
searchVal 값을 null 허용을 하고 searchVal?.let을 선언해서 검색어가 "" 이거나 null일때는 통과, 그 외는 containsIgnoreCase를 사용해서 이름 like 검색을 하게 추가 하였음
결과
searchVal null인경우
-> 모든 항목이 나옴
searchVal 빈값인 경우
-> 모든 항목이 나옴
searchVal -> aa로 보낸경우
aa@naver.com 데이터가 조회됨