[QueryDSL] Order & Paging

KMS·2022년 5월 2일
0

QueryDSL

목록 보기
3/8

Order

	@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()) 지정할 수 있습니다.

Paging

	@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;' 가 실행됩니다. 페이징 같은 경우에는 매우 직관적으로 사용이 가능합니다.

profile
Student at Sejong University Department of Software

0개의 댓글