JPQL 페이징, 조인
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C
페이징과 조인을 알아보기 전에 현재 entity는 다음과 같습니다.
Member
Team
Order
Product
값타입 Address
페이징 API
JPQL을 사용하여 페이징을 쉽게 할 수 있습니다.
• JPA는 페이징을 다음 두 API로 추상화
• setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작)
• setMaxResults(int maxResult) : 조회할 데이터 수
아래처럼 사용합니다.
출력문 결과를 보시면 잘 가져왔음을 알 수 있습니다.
아래와 같은 select문 쿼리가 방언처리 되어 나갑니다.
만약 Oracle을 사용한다면 Oracle방언 처리가 적용됩니다.
(물론 아래처럼 Oracle방언을 선택하셔야합니다.)
위처럼 Oracle을 적용하면 아래와 같은 쿼리문이 나갈것입니다.
조인
• 내부 조인:
SELECT m FROM Member m [INNER] JOIN m.team t
• 외부 조인:
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
• 세타 조인:
select count(m) from Member m, Team t where m.username = t.name (연관관계가 전혀 없는 것 같은 조인)
내부조인 :
위와 같이 조인하고 아래처럼 파라미터를 적용할 수 있습니다.
추가로 위의 결과를 보시면 LAZY가 적용되어 for문으로 하나의 member.getTeam()을 수행할 때마다 select쿼리가 나가는 것을 보실 수 있습니다.
외부 조인 :
(outer는 생략가능합니다.)
세타 조인 :
딱히 관계가 없는 대상들을 조회할 때 사용되는 세타조인입니다. 현재 username ==team.name인 member를 찾는 쿼리입니다.
쿼리를 보면 cross 조인으로 나갑니다. 즉 member X team을 하고, member.username == team.name을 찾습니다.
조인 - ON 절 :
ON절을 활용한 조인
• 조인 대상 필터링
• 연관관계 없는 엔티티 외부 조인
1. 조인 대상 필터링
예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인
2. 연관관계 없는 엔티티 외부 조인
예) 회원의 이름과 팀의 이름이 같은 대상 외부 조인