오봉이와 함께하는 개발 블로그

스프링 데이터 JPA - 순수 JPA 페이징과 정렬 본문

BE/JPA

스프링 데이터 JPA - 순수 JPA 페이징과 정렬

오봉봉이 2022. 9. 13. 00:40
728x90

순수 JPA 페이징과 정렬

JPA에서 페이징을 어떻게 할 것인가?

  • 조건
    • 검색 조건 : 나이가 10살
    • 정렬 조건 : 이름으로 내림차순
    • 페이징 조건 : 첫 번째 페이지, 페이지당 보여줄 데이터는 3건

JPA 페이징 리포지토리 코드

public List<Member> findByPage(int age, int offset, int limit) {
    return em.createQuery("select m from Member m where m.age = :age order by m.usernamdesc", Member.class)
            .setParameter("age", age)
            .setFirstResult(offset)
            .setMaxResults(limit)
            .getResultList();
}
public long totalCount(int age) {
    return em.createQuery("select count(m) from Member m where m.age = :age", Long.class)
            .setParameter("age", age)
            .getSingleResult();
}
@Test
public void paging() throws Exception {
    // given
    memberJpaRepository.save(new Member("member1", 10));
    memberJpaRepository.save(new Member("member2", 10));
    memberJpaRepository.save(new Member("member3", 10));
    memberJpaRepository.save(new Member("member4", 10));
    memberJpaRepository.save(new Member("member5", 10))

    // page 1 = offset = 0, limit = 10
    // page 2 = offset = 10, limit = 10
    // ...........


    int age = 10;
    int offset = 0;
    int limit = 3;

    // when
    List<Member> members = memberJpaRepository.findByPage(age, offset, limit);
    long totalCount = memberJpaRepository.totalCount(age)

    // then
    assertThat(members.size()).isEqualTo(3);
    assertThat(totalCount).isEqualTo(5);
}

JPA는 방언이 있어서 사용하는 DB 마다 다른 쿼리가 나가기 때문에 JPQL을 바꾸지 않아도 된다.

인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
Comments