스프링데이터 + JPA/QueryDSL

11. 정렬

sdafdq 2023. 11. 28. 13:24
@Test
public void sort(){
    em.persist(new Member(null, 100));
    em.persist(new Member("member5", 100));
    em.persist(new Member("member6", 100));

    List<Member> result = query.selectFrom(m).where(m.age.eq(100))
            .orderBy(m.age.desc(), m.username.asc().nullsLast())
            .fetch();

    Member member5 = result.get(0);
    Member member6 = result.get(1);
    Member memberNull = result.get(2);

    assertThat(member5.getUsername()).isEqualTo("member5");
    assertThat(member6.getUsername()).isEqualTo("member6");
    assertThat(memberNull.getUsername()).isNull();
}

그냥 나이 100인거 다 저장 시킨다음에,

 

where 할 때 m.age = 100 인것만 찾는데,

ordery by 해서 m.age 순으로 desc 순으로, 또 m.username asc 순으로 하는데 null last, 즉 username이 null인 것은 맨 뒤로 보내버림.

 

fetch() 해서 결과를 List로 가져옴.

 

정렬을 했는데, 정렬 내용을 정리해 보자면

age는 사실 다 똑같으니 관계 없고,

username을 ascending 순으로 정렬을 했으니, member5가 문자열 상에서 현재는 가장 값이 낮으니까 그게 맨 첫번째로 나올거임.

그리고 username이 null인 것은 nullLast(), 즉 null인 것은 last로 보내버리라고 했음.

 

쿼리

/* select
    member1 
from
    Member member1 
where
    member1.age = ?1 
order by
    member1.age desc,
    member1.username asc nulls last */

먼저 jpql

의도했던 데로 만들어 짐. where의 age 에는 100이 들어갔을 거고,

order by 해서 age는 desc 순으로 먼저 그렇게 정렬되어진 다음에,

만약 그것들이 같다면 username을 ascending 순으로, 그리고 걔중에서 null인건 맨 끝으로

 

지금은 데이터 집합? member5,6에 null 밖에 없는데,

null인거 더 많고 where해서 나이 지정한거 빼고 저 nulls last 하면 그러니까 예를들어 98, 97 나이가 다 null인것이 있다고 하면, 각각 98그룹의 끝에 배치되고, 97그룹의 끝에 배치된다.

 

nullLast()말고 nullFirst()도 있음.

 

select
    m1_0.member_id,
    m1_0.age,
    m1_0.team_id,
    m1_0.username 
from
    member m1_0 
where
    m1_0.age=? 
order by
    m1_0.age desc,
    m1_0.username asc nulls last

sql 쿼리는 이렇게 나간다.

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

13. 그룹  (0) 2023.11.29
12. 페이징  (0) 2023.11.28
10. 결과 조회  (0) 2023.11.28
9. 검색 조건 쿼리  (0) 2023.11.28
8. Q타입  (0) 2023.11.28