@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 |