SQL로 하면 힘든데 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);
}