@Test
void queryDslOrderBy() {
/**
* 회원 정렬 순서:
* 1. 회원 나이 내림차순 DESC
* 2. 회원 이름 오름차순 ASC
* => select *from member order by age desc, username asc;
*/
em.persist(new Member("MemberE", 35));
em.persist(new Member(null, 35));
factory = new JPAQueryFactory(em);
QMember member = QMember.member;
List<Member> members = factory
.select(member)
.from(member)
.orderBy(member.age.desc(), member.username.asc().nullsLast()) // nullsLast() -> null일 경우 마지막 순서로 가져옴; nullsFirst() -> null일 경우 처음으로 가져옴
.fetch();
}
orderBy()로 Order By를 처리할 수 있습니다. 이때, 쿼리문과 비슷하게 orderBy() 안에 복수의 Column들을 상대로 어떻게 정렬할지 정할 수 있습니다. 해당 예제에서는 Member의 age를 내림차순으로 정렬하고, age가 같을 경우 username을 오름차순으로 정렬합니다. 또한, 해당 Column의 값이 NULL일 경우, 해당 튜플을 맨 처음으로 보여줄지(nullsFirst()) 또는 맨 마지막으로 보여줄지(nullsLast()) 지정할 수 있습니다.
@Test
void queryDslPaging() {
factory = new JPAQueryFactory(em);
QMember member = QMember.member;
List<Member> members = factory.selectFrom(member)
.offset(1)
.limit(2)
.fetch();
Assertions.assertThat(members.size()).isEqualTo(2);
Assertions.assertThat(members.get(0).getUsername()).isEqualTo("MemberC");
}
쿼리문 'SELECT *FROM member LIMIT 2 OFFSET 1;' 가 실행됩니다. 페이징 같은 경우에는 매우 직관적으로 사용이 가능합니다.