1 minute read

JPQL2

경로 표현식

쿼리문에서 .을 찍어 객체 그래프를 탐색하는 것

상태필드 : 단순히 값을 저장히기 위한 필드

private String username; //상태필드

연관필드: 연관 관계를 위한 필드

  • 단일 값 연관 필드
    • @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team)
  • 컬렉션 값 연관 필드:
    • @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders)

특징

  • 상태필드: 경로 탐색의 끝, 탐색X

      "SELECT m.username, m.age FROM Member m"
    
  • 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색O

      String query="select m.team From Member m";
      // Member Team사이의 내부조인 발생
    

    문제는 큰 애플리케이션에서 내부조인을 사용시 성능상 문제

    실무에서 사용 권장X

  • 컬렉션 값 연관 경로: 묵시적 내부조인 발생, 탐색 X

      String query="select m From Team t join t.members m";
      // 'm' 별칭을 얻어 별칭을 통해 탐색
    

페치 조인 (fetch join)

SQL 조인 종류X

JPQL에서 성능 최적화를 위해 제공하는 기능

연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능

엔티티 페치 조인

  • 회원을 조회하면서 연관된 팀도 함께 조회(SQL 한 번에)

      // item 중에 book,movie를 조회해라
      //[JPQL]
      select m from Member m join fetch m.team
        
      //[SQL]
      SELECT M.*, T.* FROM MEMBER M
      INNER JOIN TEAM T ON M.TEAM_ID=T.ID
    

페치 조인과 Distinct

SQL의 DISTINCT는 중복된 결과를 제거하는 명령

JPQL의 DISTINCT 2가지 기능 제공

  • SQL에 DISTINCT를 추가
  • 애플리케이션에서 엔티티 중복제거

페치 조인의 특징과 한계

  • 페치 조인대상에는 별칭을 줄 수 없다.
    • 하이버네이트는 가능, 가급적 사용X
  • 둘 이상의 컬렉션은 페치 조인 할 수 없다.
    • 다대다
@BatchSize(size=100) 

페치조인 -정리

모든 것을 페치 조인으로 해결할 수 는 없음

페치 조인은 객체 그래프를 유지할 때 사용하면 효과적

다형성 쿼리

TYPE

) Item 중에 Book, Movie를 조회해라

//[JPQL]
select i from Item i
where type(i) IN (Book, Movie)
//[SQL]
select i from i
where i.DTYPE in (B, M)

TREAT(JPA 2.1)

) 부모인 Item과 자식 Book이 있다.

//[JPQL]
select i from Item i
where treat(i as Book).author = kim
//[SQL]
select i.* from Item i
where i.DTYPE = B and i.author = kim

엔티티 직접 사용

JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용

Named 쿼리 - 정적 쿼리

어노테이션,xml에 정의

애플리케이션 로딩 시점에 초기화 후 재사용

애플리케이션 로딩 시점에 쿼리를 검증

Updated: