페이징과 정렬
순수 JPA
@Repository
public class MemberJpaRepository {
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) {
// 단순 count니까 sort 조건은 빠진다.
return em.createQuery("select count(m) from Member m where m.age = :age", Long.class)
.setParameter("age", age)
.getSingleResult();
}
}@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberJpaRepositoryTest {
@Autowired
MemberJpaRepository memberJpaRepository;
@Test
void paging() {
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));
int age = 10;
int offset = 0;
int limit = 3;
List<Member> members = memberJpaRepository.findByPage(age, offset, limit);
long totalCount = memberJpaRepository.totalCount(age);
assertThat(members.size()).isEqualTo(3);
assertThat(totalCount).isEqualTo(5);
}
}스프링 데이터 JPA
파라미터
반환 타입
예제
Page
Slice
List
Count 최적화
페이지를 유지하면서 엔티티를 DTO로 변환
Last updated