org.springframework.data.domain.Sort;
org.springframework.data.domain.Page;
org.springframework.data.domain.PageRequest;
Sort : 정렬기능
Pageable : 페이징기능
* 반환타입
Page : totalCount 가 포함 된 페이징
Slice : totalCount 미포함 ( 모바일에 더보기 기능 같은거)
public interface MemberRepository extends JpaRepository<Member, Long> {
Page<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;
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
Page<Member> page = memberRepository.findByAge(age, pageRequest);
List<Member> content = page.getContent();
for (Member member : content) {
System.out.println("member = " + member);
}
assertThat(page.getSize()).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(); //다음페이지 있냐?
}
* 쿼리와 카운트 쿼리를 분리해서 작성가능
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query(value = "select m from Member m left join m.team",
countQuery = "select count (m) from Member m")
Page<Member> findByAge(int age, Pageable pageable);
}
레프트 조인 , 별도의 where 문이 없으니까 카운트 결과가 같음.
* .map 으로 entity -> dto 로 변환 가능
Page<MemberDto> tomap = page.map(m -> new MemberDto(m.getId(), m.getUsername(), null));
* 벌크성 수정쿼리
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
Modifying 어노테이션을 꼭 추가해줘야 됨
'Web > JPA' 카테고리의 다른 글
확장기능 (0) | 2020.02.18 |
---|---|
API 고급( 지연로딩과 조회성능 최적화) (0) | 2020.02.13 |
고급매핑 (0) | 2020.02.03 |
다양한 연관관계 매핑 (0) | 2020.02.02 |
연관관계 매핑 기초 (0) | 2020.02.01 |