JPA/JPQL

JPQL 페이징, 조인

킹차니 2021. 7. 20. 13:23
김영한님의 인프런 강의와 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방언을 선택하셔야합니다.)

persistence.xml

위처럼 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. 연관관계 없는 엔티티 외부 조인 

 

) 회원의 이름과 팀의 이름이 같은 대상 외부 조인