쿼리 메소드의 남은 강의 두 개입니다. 정렬과 페이징이 되시겠습니다. 이번에도 메서드의 이름 규칙을 좀 더 배우지만, 추가로 패러미러를 넣는 방법도 배웁니다.
OrderBy(프로퍼티_이름)(Desc|Asc)
쿼리 메소드에서 정렬을 하려면 정렬 기준 프로퍼티를 포함하여 OrderBy 를 넣습니다. 잊지 마세요, 정렬 기준 프로퍼티를 꼭 넣어야 합니다. 정렬 순서 표시는 끝에 Desc 혹은 Asc 를 붙이면 되는데, 흔하죠? (내림차순, 오름차순의 약어)
쿼리는 order by 구문이 들어갑니다.
// First 대신 Top
fun findTop1ByNameOrderByIdDesc(name: String): User? // order by desc
// 1 생략 가능
fun findTopByNameOrderByIdDesc(name: String): User?
from
user user0_
where
user0_.name=?
order by
user0_.id desc limit ?
정렬 조건을 추가로 걸려면, And 없이 바로 이어서 써야합니다. And 를 적는 경우 IDE에서 경고를 띄웁니다. 안 된다는 말이죠. OrderByIdDescEmailAsc 처럼요.
// And 를 넣으면 IDE에서 경고를 띄웁니다. 그 다음은 아시죠?
// fun findFirstByNameOrderByIdDescAndEmailAsc(name: String): User?
fun findFirstByNameOrderByIdDescEmailAsc(name: String): User?
쿼리 생략
Sort 패러미터를 추가해서 정렬하기
쿼리 메소드의 이름이 길어지면 가독성 면에서 기부니가 매우 나쁠 수 있습니다. 기부니가 요단강을 건너시면 어쩌구저쩌구... 아무튼
메소드 이름에 OrderBy 를 넣는 대신에 다른 JPA 의 API 에서 하는 거처럼 쿼리 메소드에도 Sort 를 패러미터로 추가할 수도 있습니다.
fun findByName(name: String, sort: Sort): List<User>
userRepo.findByName("martin", Sort.by(Order.asc("id") /*, Order.desc("name"), ...*/))
// Order 는 Sort.Order 로, 서브클래스입니다.
// kotlin 에서 자동완성을 했다간 아래처럼 되겠죠.
// Sort.By(Sort.Order.asc("id"))
// 이게 꼴보기 싫다면 import 를 적당히 하면 됩니다.
// import org.springframework.data.domain.Sort.Order as Order
OrderBy 는 이처럼 방법이 두 가지이므로, 가독성이 더 나은 걸 선택하는 게 좋다네요. Sort 가 길어지면 메소드로 빼도 되고 말이죠.
그리고 이 방식은 페이징에도 씁니다.
페이징 - Page<TEntity>, Pageable
페이징을 하려면 쿼리 메소드의 추가 패러미터로 Pageable (인터페이스입니다!) 를, 반환형으로 Page<TEntity> 를 넣으면 됩니다.
// 클래스! Slice<T> 를 상속!
// vvvvvvvvvv
fun findByName(name: String, paging: Pageable): Page<User>
// ^^^^^^^^
// 인터페이스! PageRequest 가 구현!
위의 주석에도 적어놨는데, 강의를 진행하시면서 Page<T> 클래스와 Pageable 인터페이스의 API를 코드를 파보면서 확인하셨습니다. 필기를 좀 잘못해놨는데
- Page<T> 의 기능은 대부분이 부모클래스인 Slice<T> 에서 오는 거구요,
- Pageable 은 인터페이스라서 (I좀 붙이라니까!!!) 호출할 때에는 이걸 구현하는 PageRequest 를 만들어서 넣어야 합니다.
userRepo.findByName("martin", PageRequest.of(0, 2, Sort.by(Order.asc("id"))))
SQL 쿼리는 엔티티의 전체 개수를 세기 위한 것까지 포함해서 2번 일어납니다.
Hibernate:
select
필드 조회 생략
from
user user0_
where
user0_.name=?
order by
user0_.id asc limit ?
Hibernate:
select
count(user0_.id) as col_0_0_
from
user user0_
where
user0_.name=?
Slice<T> 의 메소드는 의외로 쓸 일이 적다네요? 직접 해보라고 하시고 스킵. 뭐 필요할 때 보죠 ㅎㅎ
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스: https://bit.ly/37BpXiC
#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는JavaSpring웹개발마스터초격차패키지Online
오늘 제출일... 나는 무거운 걸 들고와서 손꾸락에 힘이 없고... 타이핑은 해야겠고...
'FastCampus - 한번에 끝내는 Java|Spring 웹 개발 > 04 JPA' 카테고리의 다른 글
JPA Ch 5 Entity Listener - 패스트캠퍼스 챌린지 24일차 (0) | 2022.02.16 |
---|---|
JPA Ch 4 Entity 기본 어노테이션들 - 패스트캠퍼스 챌린지 23일차 (0) | 2022.02.15 |
JPA Ch 3 Query Method (2~3) - 패스트캠퍼스 챌린지 21일차 (0) | 2022.02.13 |
JPA Ch 3 Query Method (1) - 패스트캠퍼스 챌린지 20일차 (0) | 2022.02.12 |
JPA Ch 2 SprDatJPA 기초 (2) - 패스트캠퍼스 챌린지 19일차 (0) | 2022.02.11 |