조건

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.username desc")
						.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();
}

Spring Data JPA 페이징과 정렬


페이징과 정렬 사용 예제

Page<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용

Slice<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안함

List<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안함

List<Member> findByUsername(String name, Sort sort);

// where 문이 필요 없어도 메서드 끝에 By를 붙여줘야한다! (참조 사이트2 참고)

Page 사용 예제 정의 코드

public interface MemberRepository extends Repository<Member, Long> {

 Page<Member> findByAge(int age, Pageable pageable);

}

Page 사용 예제 실행 코드

//페이징 조건과 정렬 조건 설정
@Test
public void page() throws Exception {

	//given
	memberRepository.save(new Member("member1", 10));
	memberRepository.save(new Member("member2", 10));
	memberRepository.save(new Member("member3", 10));
	memberRepository.save(new Member("member4", 10));
	memberRepository.save(new Member("member5", 10));

	//when
	PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
	Page<Member> page = memberRepository.findByAge(10, pageRequest);

	//then
	List<Member> content = page.getContent(); // 조회된 데이터
	assertThat(content.size()).isEqualTo(3); // 조회된 데이터 수
	assertThat(page.getTotalElements()).isEqualTo(5); // 전체 데이터 수
	assertThat(page.getNumber()).isEqualTo(0); // 페이지 번호
	assertThat(page.getTotalPages()).isEqualTo(2); // 전체 페이지 번호
	assertThat(page.isFirst()).isTrue(); // 첫번째 항목인가?
	assertThat(page.hasNext()).isTrue(); // 다음 페이지가 있는가?

}

주의 : Page는 1부터 시작이 아니라 0부터 시작이다.