SQL로 하면 힘든데 JPA는 편하게 할 수 있게 해준다.

예제

순수 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", 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 findByPage() {
	Member m1 = new Member("AAA", 10);
	Member m2 = new Member("BBB", 10);
	Member m3 = new Member("CCC", 10);
	Member m4 = new Member("DDD", 10);
	Member m5 = new Member("EEE", 10);
	memberJpaRepository.save(m1);
	memberJpaRepository.save(m2);
	memberJpaRepository.save(m3);
	memberJpaRepository.save(m4);
	memberJpaRepository.save(m5);

	int age = 10;
	int offset = 0;
	int limit = 3;
	List<Member> result = memberJpaRepository.findByPage(age, offset, limit);
	long totalCount = memberJpaRepository.totalCount(age);

	assertThat(result.size()).isEqualTo(3);
	assertThat(result.get(0).getUsername()).isEqualTo("EEE");
	assertThat(result.get(1).getUsername()).isEqualTo("DDD");
	assertThat(result.get(2).getUsername()).isEqualTo("CCC");
	assertThat(totalCount).isEqualTo(5);
}