내부 조인 사용시에는
INNER JOIN을 사용하고, INNER 는 생략이 가능하다.Stirng teamName = "팀A"; Stirng query = "SELECT m FROM Member m INNER JOIN m.team t " + "WHERE t.name = "teamName";
- JPQL 가장 큰 특징은 연관 필드를 사용한다는 것 (m.team)
SELECT m FROM Member m LIST [OUTER] JOIN m.team t;
- Outer 는 생략이 가능해서 보통 LEFT JOIN 으로 많이 사용하한다.
- 일대다 관계, 다대다 관계 처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.
[회원 -> 팀] 으로의 조인: 다대일 조인이면서 단일 값 연관 필드 (m.team) 을 사용한다 [팀 -> 회원] 으로의 조인: 일대다 조인이면서 컬렉션 값 연관 필드 (m.members) 를 사용한다.CODE)
SELECT t, m FROM Team t LEFT JOIN t.members m
- 여기서 t LEFT JOIN t.members 는 팀과 팀이 보유한 회원목록을 컬렉션 값 연관 필드로 외부 조인했다.
JPQL 에서 성능 최적화를 위해 제공하는 기능
연관된 엔터티나 컬렉션을 한 번에 같이 조회하는 기능join fetch사용
- 엔티티 페치 조인
-> 페치 조인을 사용해서 회원 엔티티를 조회하면서 연관된 팀 엔터티도 함께 조회하는 JPQLselect m FROM Member m join fetch m.team- join fetch 를 사용하면 연관된 엔터티나, 컬렉션을 함께 조회한다.
(회원 (m) 과 팀(m.team) 을 함께 조회한다. 페치 조인은 별칭을 사용할 수 없다.
페치 조인의 특징과 한계
1. 페치 조인을 사용하면 SQL 한번으로 연관된 엔터티들을 함께 조회할 수 있어서 SQL 호출 횟수를 줄여 성능 최적화가 가능하다.2. 페치 조인 대상에는 별칭을 줄 수 없다.글로벌 로딩 전략 - 엔터티에 직접 적용하는 로딩 전략 최적화를 위해 글로벌 로딩 전략을 즉시 로딩으로 설정하면 애플리케이션 전체에서 항상 즉시 로딩이 일어난다. 물론 일부는 빠를 수 있으나, 전체적으로 봤을때 사용하지 않는 엔터티를 자주 로딩하므로 오히려 성능면으로는 좋지 않은 편. 따라서 글로벌 로딩 전략 사용시에는 지연 로딩을 사용하고, 최적화가 필요할 경우에는 페치 조인을 적용하는 것이 효과적.
3. 둘 이상의 컬렉션을 페치할 수 없다.
4. 컬렉션을 페치 조인할 경우 페이징 API 를 사용할 수 없다.
5. 페치 조인은 SQL 한번으로 연관된 여러 엔터티를 조회할 수 있기 때문에 성능 최적화에 상당히 유용함.
서브쿼리 함수
- [NOT] EXISTS (subquery)
-> 서브쿼리에 결과가 존재하면 참. NOT 은 반대- {ALL | ANY | SOME } (subquery)
-> 비교 연산자와 같이 사용
- ALL : 조건을 모두 만족하면 참
- ANY & SOME : 조건을 하나라도 만족하면 참.- [NOT] IN (subqeury)
-> 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참.