JPA/JPA 기본

48. 페치 조인 한계

sdafdq 2023. 11. 1. 12:02

패치 조인 대상에는 별칭을 줄 수 없음.ㄹ

 

하이버네이트는 가능하긴 하나, 사용하지 말라고 함.

 

별칭이라면 그러니까 예를 들어 join fetch t.members m where m.name = '홍길동'

이런 거 못 쓴다는 거임.

 

 fetch join 컨셉은 기본적으로 나랑 연관된 데이터를 다 끌고 오는 거임.

 

Team의 members가 5명이 나와야 하는데, m.where해서 3명만 나오면.. 그럼 2명 누락될 수 있고..

 

그래서 뭐 별칭써서 뭐.. 이런 거는 안 맞음. 쓰지 마셈. 이상하게 동작할 수 있음. 위험함. 

 

 

둘 이상의 컬렉션은 패치 조인 할 수 없다.

일대다도 뻥튀기가 되는데, 일대 다 다 이니..

 

패치조인 할 때 컬렉션은 하나만 지정할 수 있다.

 

 

패치조인은 페이징을 사용할 수 없다.

실행은 되는데, 경고를 뿜는다.

11월 01, 2023 12:16:56 오후 org.hibernate.query.sqm.internal.QuerySqmImpl executionContextFordoList
WARN: HHH90003004: firstResult/maxResults specified with collection fetch; applying in memory

말 그대로 

경고 : firstResult/maxResults가 지정되었습니다. 콜렉션 패치와 함께.

다 불러오고 메모리에서 페이징.

 

나가는 쿼리 보면

Hibernate: 
    /* select
        t 
    from
        Team t 
    join
        fetch t.members m */ select
            t1_0.id,
            m1_0.team_id,
            m1_0.id,
            m1_0.age,
            m1_0.type,
            m1_0.username,
            t1_0.name 
        from
            Team t1_0 
        join
            Member m1_0 
                on t1_0.id=m1_0.team_id

그냥 다 불러오고 메모리에서만 페이징 하는거임.

 

위험하니까 쓰지 마라.

 

 

 

결국 패치 조인은 있는 데이터를 모두 묶어오는 컨셉인데,

거기에 안맞는 개념들과 함께 사용하려고 하는 것에서 문제가 발생한다.
중복, where 필터링을 통한 모두에서 선별된 것들로 끌어오려고 시도 등.

모두를 끌어와야 하는 건데 페이징을 통해 일부만 끌어오려고 하는 둥.

 

 

여기 이렇게 fetch join해서 다 가져오는데,

팀A 쪽만 있다 치고 가져오는데 페이징해서 row 1개만 가져온다고 생각해 보셈.

 

나두 잘 물러. 위험하다고 함.

 

 

 

페이징 하고싶으면

일대다는 다대일로도 변경해서 가져오는 것도 가능하므로

List<Team> result1 = em.createQuery("select t from Team t join fetch t.members", Team.class)
                .getResultList();

여기서

 

List<Member> result1 = em.createQuery("select m from Member m join fetch m.team t", Member.class)
                .getResultList();

이런 식으로. 이러면 페이징 문제 없음.

'JPA > JPA 기본' 카테고리의 다른 글

49. 다형성 쿼리  (0) 2023.11.03
48-2. 패치 조인의 한계  (0) 2023.11.02
47. 페치 조인 기본  (0) 2023.11.01
46. 경로 표현식  (0) 2023.11.01
45. JPQL 함수  (0) 2023.10.31