728x90
인터페이스 구현
import com.study.datajpa.dto.MemberDto;
import com.study.datajpa.entity.Member;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Collection;
import java.util.List;
public interface MemberRepository extends JpaRepository<Member, Long> {
// @Query(value = "select m from Member m left join m.team t",
// countQuery = "select count(m) from Member m")
// 실무에서는 countQuery를 작성해 성능 최적화 필요할수도 있음
Page<Member> findByAge(int age, Pageable pageable);
// Page는 토탈카운트를 가져와 성능 부하 걸릴 수 있음, Slice는 가져오는 엘리먼트 + 1로 페이징 기능 구현현
// Slice<Member> findByAge(int age, Pageable pageable);
}
테스트케이스
@Test
public void paging(){
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));
int age = 10;
// 0 은 page number , 3 은 count
PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC, "username");
// Total페이지를 가지고오면 성능에 부담이가는 경우 (요청 size에서 +1 한 만큼 가져와서 값이 있으면 True, 없으면 False) total count 안 가지고 옴
// 인터페이스도 Slice로 리턴해줘야함
// Slice<Member> page = memberRepository.findByAge(age, pageRequest);
// 리스트로도 받을 수 있음. 대신 pageing함수 사용 불가
Page<Member> page = memberRepository.findByAge(age, pageRequest);
// dto로 반환
Page<MemberDto> toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
List<Member> content = page.getContent();
// 갖고온 사이즈
assertThat(content.size()).isEqualTo(3);
// 총 엘리먼트 개수
// Slice 사용하면 사용 못함
assertThat(page.getTotalElements()).isEqualTo(5);
// 페이지 번호
assertThat(page.getNumber()).isEqualTo(0);
//전체 페이지 개수
// Slice 사용하면 사용 못함
assertThat(page.getTotalPages()).isEqualTo(2);
// 첫벗째 페이지이인가?
assertThat(page.isFirst()).isTrue();
// 다음페이지가 있나?
assertThat(page.hasNext()).isTrue();
}
728x90
'백엔드 > JPA' 카테고리의 다른 글
스프링 데이터 jpa 패치조인 @EntityGraph (0) | 2021.10.23 |
---|---|
스프링 데이터 jpa 벌크 쿼리 (0) | 2021.10.23 |
스프링 데이터 JPA 복잡한 정적 쿼리 @Query (0) | 2021.10.22 |
스프링 데이터 JPA 기초 (0) | 2021.10.22 |
JPA 조인 (0) | 2021.10.19 |