본문 바로가기
강의 정리/자바 ORM 표준 JPA

10. 중급 문법

by 이석준석이 2021. 1. 2.

1. 경로표현식 특징

 

상태 필드

  • 단순히 값을 저장하기 위한 필드
  • ex) m.username

 

연관 필드

  • 단일 값 연관 필드 @XToOne
    • 묵시적 조인이 발생 (inner join)
  • 컬랙션 값 연관 필드 @XToMany
    • 묵시적 조인이 발생

묵시적 조인을 쓰지말고, 명시적 조인을 만들어서 써라.


2. 페치 조인

  • JPQL 성능 최적화를 위해 제공되는 기능이다.
  • 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능이다.

ex) select m from Member m join fetch m.team

 

컬렉션 패치 조인

  • 1대 다 조인인 경우에는 데이터가 뻥튀기 될 수 있다.
    • distinct로 제거할 수 있다.
      • JQPL distinct는 중복된 엔티티를 제거해준다. (sql distinct 와는 조금 차이가 있음)
String query = "select distinct t from Team t join fetch t.members";

3. 페치조인 특징과 한계

  • 페치조인 대상에는 Alias 를 줄 수 없다.
    • hibernate는 가능하나 사용하지 말자.
    • 페치조인을 하는 대상에는 조건문을 줘서 몇개만 뽑는 행동을 하지 말자
    • cascade 옵션같이 많이 들어있으면 데이터가 이상해질 수 있다.
// 사용 ㄴㄴ
String query = "select t from Team t join fetch t.members m where m.age < 10"; 

// 사용할거면 Member에서 시작하자
select m from Member m join fetch m.team t where m.age < 10

 

  • 둘 이상의 컬렉션은 페치 조인 할 수 없다. = 페치 조인에 컬렉션은 하나만 지정할 수 있다.
  • 컬렉션을 페치 조인하면 페이징 API를 쓰지마라.
    • XToOne 은 페이징 가능
    • XToMany 는 페이징 불가능, 페이징이 아예 적용이 안됨
      • @BatchSize를 이용해서 in(?, ?) 쿼리를 통해서 가져오는 방식을 사용해야 한다.
      • 혹은 global batchsize 세팅
        • hibernate.default_batch_fetch_size 를 사용

4. 다형성 쿼리

 

type

select i 
from item i
where type(i) IN (Book, Movie)
-> 
select i 
from i 
where i.DTYPE in ('B', 'M')

treat

select i 
from Item i
where treat(i as Book).author = 'kim'
->
select i.* 
from item i
where i.DTYPE = 'B' and i.author = 'kim'

5. 엔티티 직접 사용

 

예시) 엔티티를 count로 직접 넘긴다.

select count(m) from Member m;
->
select count(m.id) as cnt from Member m;

 

그런 경우, 엔티티의 PK (m-> m.id) 를 사용하여 수행된다.


6. JPQL Named Query 어노테이션

 

@NamedQuery

  • 정적 쿼리만 가능하다.
  • 어플리케이션 로딩 시점에 초기화한 뒤에, 캐시에 보관하고 재사용한다.
  • 로딩 시점에 쿼리를 검증할 수 있다. (컴파일 타임 검증 가능)
정의 사용

7. 벌크 연산

 

쿼리 한번으로 여러 테이블의 로우를 변경

  • executeUpdate()
  • update / delete 모두 .executeUpdate() 사용
int count = em.createQuery("update Member m set m.age = 20").executeUpdate();

 

영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 날린다.

 

따라서 bulk 연산 이후에 영속성 컨텍스트를 초기화해줘야 한다.

  • em.clear()

 

'강의 정리 > 자바 ORM 표준 JPA' 카테고리의 다른 글

9. 기본 문법  (0) 2021.01.02
8. 값 타입  (0) 2021.01.01
7. 프록시와 연관관계 관리  (0) 2021.01.01
6. 고급 매핑  (0) 2020.12.29
5. 다양한 연관관계 매핑  (0) 2020.12.28