JPA(JPQL Query, JPA paging, fetch join)

jhwan·2024년 12월 12일
  1. JPQL
@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();
  1. Spring JPA Paging
    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(); //다음 페이지가 있는가?
    }
  1. QueryHint
@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);

변경감지를 무시하나 성능은 최적화됨.거의 쓸일은 없을 것 같다.

  1. native Query
    nativeQuery = true로 설정한다.
    DTO를 가져올 때 많이 쓰입니다. => JdbcTemplate나 mybatis를 권장
@Query(value = "select * from member where username = ?", nativeQuery =
true)
 Member findByNativeQuery(String username);

0개의 댓글