public interface MemberRepository extends JpaRepository<Member, Long> {
...
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);
}
@Query를 사용하면 메소드 이름을 깔끔하게 가지고 갈 수 있음
그 귀찮은 페이징을 data jpa를 활용하면 간단하게 할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
...
Page<Member> findByAge(int age, Pageable pageable);
}
@Test
public void paging() {
//given
memberRepository.save(new Member("member1", 20));
memberRepository.save(new Member("member2", 20));
memberRepository.save(new Member("member3", 20));
memberRepository.save(new Member("member4", 20));
memberRepository.save(new Member("member5", 20));
memberRepository.save(new Member("member6", 20));
memberRepository.save(new Member("member7", 20));
int age = 20;
PageRequest page = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); //중요!! 0부터 3개
//when
Page<Member> pageList = memberRepository.findByAge(age, page);
//then
List<Member> content = pageList.getContent();
long totalElements = pageList.getTotalElements();
for (Member member : content) {
System.out.println("member = " + member);
}
assertThat(content.size()).isEqualTo(3);
assertThat(totalElements).isEqualTo(7);
assertThat(pageList.getNumber()).isEqualTo(0); //현재 페이지
assertThat(pageList.getTotalPages()).isEqualTo(3); //전체 페이지
assertThat(pageList.isFirst()).isTrue();
assertThat(pageList.hasNext()).isTrue();
}
public interface MemberRepository extends JpaRepository<Member, Long> {
...
Slice<Member> findByAge(int age, Pageable pageable);
}
@Test
public void paging() {
//given
memberRepository.save(new Member("member1", 20));
memberRepository.save(new Member("member2", 20));
memberRepository.save(new Member("member3", 20));
memberRepository.save(new Member("member4", 20));
memberRepository.save(new Member("member5", 20));
memberRepository.save(new Member("member6", 20));
memberRepository.save(new Member("member7", 20));
int age = 20;
PageRequest page = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
//when
Slice<Member> pageList = memberRepository.findByAge(age, page); //Slice는 4개를 요청
//then
List<Member> content = pageList.getContent();
// long totalElements = pageList.getTotalElements();
for (Member member : content) {
System.out.println("member = " + member);
}
assertThat(content.size()).isEqualTo(3);
// assertThat(totalElements).isEqualTo(7);
assertThat(pageList.getNumber()).isEqualTo(0);
// assertThat(pageList.getTotalPages()).isEqualTo(3);
assertThat(pageList.isFirst()).isTrue();
assertThat(pageList.hasNext()).isTrue();
}
사실 entity를 반환하면 안되기 때문에 꼭 map을 사용해 dto로 변경해 return하자~
public interface MemberRepository extends JpaRepository<Member, Long> {
...
//성능 최적화를 위해 countQuery 분리 가능 특히 join한 모든 값을 다~~ 가져오면 안되니깐 분리
//sorting도 복잡해지면 따로 query가능
@Query(value = "select m from Member m left join m.tean t",
countQuery = "select count(m) from Member m")
Page<Member> findByAge(int age, Pageable pageable);
}
Page<Member> pageList = memberRepository.findByAge(age, page);
Page<MemberDto> map = pageList.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
간단하게 fetch join을 할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
...
// 1번
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();
//1번과 같은 메소드
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
}