@Query("select m from Member m where m.username= :username and m.age = :age")
List<Member> findUser(@Param("username") String username, @Param("age") int age);
@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) "
+ "from Member m join m.team t")
List<MemberDto> findMemberDto();
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);
// Modifying이있어야 executeUpdate()를 호출한다.
// 주의 Bulk 연산은 영속성 context를 무시하고 바로 DB에 update하기 때문에
// Bulk 연산 이후 영속성 context를 비워줘야 한다.
// 영속성 context를 비우는 방법은, em.flush(), em.clear() 해야 한다
// or @Modifying(clearAutomatically = true)를 사용하면 된다.
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age); // update가 된 row들의 갯수를 리턴함
// fetch조인: member.team에 대한 값을 모두 생성해서 넣어준다.
// fetchType.LAZY의 반대라고 보면 된다.
// @Override
// @EntityGraph(attributePaths = {"team"})
// List<Member> findAll(); 이거랑 같다고 보면 된다.
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();
Page<Member> findByAge(int age, Pageable pageable);
@Test
public void page() throws Exception{
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));
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest);
List<Member> content = page.getContent();
assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?
}
@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);
변경감지를 무시하나 성능은 최적화됨.거의 쓸일은 없을 것 같다.
@Query(value = "select * from member where username = ?", nativeQuery =
true)
Member findByNativeQuery(String username);