일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- springdatajpa
- 스프링
- spring
- 인프런
- kotlin
- JPQL
- pointcut
- 자바
- JDBC
- http
- Servlet
- 그리디
- Greedy
- Proxy
- 스프링 핵심 원리
- Android
- 스프링 핵심 기능
- AOP
- Spring Boot
- Thymeleaf
- transaction
- 백준
- 김영한
- QueryDSL
- java
- db
- Exception
- jpa
- SpringBoot
- 알고리즘
- Today
- Total
개발자되기 프로젝트
Query Method 3 : 정렬 본문
1.이름으로 top 1 찾기
List<User> findTop1ByName(String name);
System.out.println("find top 1 by name : " + userRepository.findTop1ByName("hyun"));
where 조건에서 limit가 걸린걸 볼 수 있다.
where
user0_.name=? limit ?
find top 1 by name : [
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-27T20:20:01.032253,
updatedAt=2021-05-27T20:20:01.032253, id=1)
]
2. last one 찾기
그러면 혹시 음 findLast1_같은 형식도 가능할까..??? 불가능하다.
대신 정렬을 반대로 뒤집어서 top1을 찾으면 last1찾는 것 과 같다.
List<User> findTop1ByNameOrderByIdDesc(String name);
이러면 기존에 의도한 findLast1ByName(String name)과 같은 로직을 제공한다.
System.out.println("find last 1 by name : "
+ userRepository.findTop1ByNameOrderByIdDesc("hyun"));
결과는..? order by로 id의 역순으로 정렬되었고!
id가 가장 큰 이름이 "hyun"인 entity를 가져왔다!
where
user0_.name=?
order by
user0_.id desc limit ?
find last 1 by name : [
User(name=hyun, email=hyun@google.com, createdAt=2021-05-27T20:25:59.033174,
updatedAt=2021-05-27T20:25:59.033174, id=5)
]
흠 그러면 findTop1이랑 findTop이 같을까??
List<User> findTopByNameOrderByIdDesc(String name);
System.out.println("find last by name : "
+ userRepository.findTopByNameOrderByIdDesc("hyun"))
top1을 찾는거나 top을 찾거나 결과는 같다.
where
user0_.name=?
order by
user0_.id desc limit ?
find last by name : [
User(name=hyun, email=hyun@google.com, createdAt=2021-05-27T20:33:08.798732,
updatedAt=2021-05-27T20:33:08.798732, id=5)]
그러면 top2로 바꾸면?
List<User> findTop2ByNameOrderByIdDesc(String name);
System.out.println("find last 2 by name : "
+ userRepository.findTop2ByNameOrderByIdDesc("hyun"))
짠 2개가 나왔고 순서는 id 역순으로 정렬했기 때문에, 5 --> 1 순으로 조회된다.
where
user0_.name=?
order by
user0_.id desc limit ?
find last 2 by name : [
User(name=hyun, email=hyun@google.com, createdAt=2021-05-27T20:33:08.798732,
updatedAt=2021-05-27T20:33:08.798732, id=5),
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-27T20:33:08.798732,
updatedAt=2021-05-27T20:33:08.798732, id=1)]
3. 정렬 기준 추가하기
id를 역순으로 정렬하고, email은 정순으로 정렬한 다음 이름이 일치하는 첫번째 entity를 찾아보자.
List<User> findFirstByNameOrderByIdDescEmailAsc(String name);
System.out.println("find first by name order by id desc Email Asc : "
+ userRepository.findFirstByNameOrderByIdDescEmailAsc("hyun"));
oder by에서 id가 역순, 이메일이 정순으로 정렬되는 것을 확인할 수 있다.
그 상태에서 첫번째로 이름이 hyun인 entity를 찾아왔당.
where
user0_.name=?
order by
user0_.id desc,
user0_.email asc limit ?
find first by name order by id desc Email Asc : [
User(name=hyun, email=hyun@google.com, createdAt=2021-05-27T20:48:01.950477,
updatedAt=2021-05-27T20:48:01.950477, id=5)]
4. parameter를 활용한 정렬
이전까지는 namimg 규직을 활용해서 order를 만들었는데, 이번에는 parameter로 해보자.
Repository에서 method 선언할 때 Sort를 넣어줄 수 있다.
List<User> findFistByName(String name, Sort sort);
그리고 desc("id")에서 id 위치에는 column명을 넣어주면 된당.
System.out.println("find first by name with sort param : "
+ userRepository.findFistByName("hyun", Sort.by(Sort.Order.desc("id"))));
이름이 hyun인 enitty가 id 역순으로 불러와졌땅.
where
user0_.name=?
order by
user0_.id desc
find first by name with sort param : [
User(name=hyun, email=hyun@google.com, createdAt=2021-05-27T20:56:53.383262,
updatedAt=2021-05-27T20:56:53.383262, id=5),
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-27T20:56:53.379662,
updatedAt=2021-05-27T20:56:53.379662, id=1)
]
그리고 sort를 자세히 살펴보면 Order를 list로 넣어줄 수 있다.
protected Sort(List<Order> orders)
즉 여러 정렬 조건을 list로 받아올 수 있다!
id는 역순, email은 정순으로 정렬하고 이름이 hyun인 entity를 순서대로 가져와보자.
간단하게 바로 위에서 사용한 코드에서 order만 추가해주면 된다.
System.out.println("find first by name with sort param : "
+ userRepository.findFistByName("hyun", Sort.by(Sort.Order.desc("id"), Sort.Order.asc("email"))));
order by에 id는 역순, email은 정순으로 적용된걸 볼 수 있다.
where
user0_.name=?
order by
user0_.id desc,
user0_.email asc
find first by name with sort param : [
User(name=hyun, email=hyun@google.com, createdAt=2021-05-27T21:05:05.186507,
updatedAt=2021-05-27T21:05:05.186507, id=5),
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-27T21:05:05.186507,
updatedAt=2021-05-27T21:05:05.186507, id=1)
]
요렇게 사용하면 가독성이 좋아진다.
왜냐 조건이 계속 추가될경우... naming규직으로 하면
findByNameOrderByIdDescEmailAscCreatedAtDesc.....줄ㅈ룾니루닝루닝루닝 너무 길어진다.
근데 parameter로 하면?
userRepository.findFistByName("hyun", Sort.by(
Sort.Order.desc("id"),
Sort.Order.asc("email"),
Sort.Order.desc("createdAt"))))
그나마 가독성이 좋아진다.
더 좋게하려면 sort method를 따로 만들어 버리면 된당.
test 코드를 요렇게 바꾸고
System.out.println("find first by name with sort param : "
+ userRepository.findFistByName("hyun", getSort()));
method를 다음과 같이 정의해주면 편 ㅡ 안 해진다.
private Sort getSort(){
return Sort.by(
Sort.Order.desc("id"),
Sort.Order.asc("email"),
Sort.Order.desc("createdAt"),
Sort.Order.asc("updatedAt")
);
}
'JPA' 카테고리의 다른 글
@Entity 기본 속성 - 1 (0) | 2021.06.15 |
---|---|
Query Method : paging (0) | 2021.05.27 |
Query Method 3 (0) | 2021.05.27 |
Query Method 활용2 (0) | 2021.05.26 |
Query Method 활용1 (0) | 2021.05.26 |