Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Query Method 3 : 정렬 본문

JPA

Query Method 3 : 정렬

Seung__ 2021. 5. 27. 22:05

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
Comments