본 포스팅은 인프러의 JPA 기본편을 수강하고 정리하는 내용입니다.
조인
엔티티를 중심으로 동작한다. 객체 스타일의 문법이다.
- 내부 조인:
SELECT m FROM Member m [INNER] JOIN m.team t
- member있고 team이 없으면 데이터가 아예 안나옴(교집합)
1 2 3
String query = "select m from Member m inner join Team t where m.username = t.name"; List<Member> result = em.createQuery(query, Member.class) .getResultList();
- 외부 조인:
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
- 회원은 있고 팀이 없어도 멤버는 조회가 됨(합집합)
1 2 3
String query = "select m from Member m left outer join Team t where m.username = t.name"; List<Member> result = em.createQuery(query, Member.class) .getResultList();
- 세타 조인:
select count(m) from Member m, Team t where m.username = t.name
- 연관관계가 전혀 없는 것을 막 비교해보고 싶을때 사용
1 2 3
String query = "select m from Member m, Team t where m.username = t.name"; List<Member> result = em.createQuery(query, Member.class) .getResultList();
조인 - ON 절
- ON절을 활용한 조인(JPA 2.1부터 지원)
- 1)조인 대상 필터링
- 2)연관관계 없는 엔티티 외부 조인(하이버네이트 5.1부터)
1. 조인 대상 필터링
- 예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인
- 조인 대상을 필터링 먼저 한 후 조인하는 방식
1
2
3
4
5
6
JPQL:
SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'
SQL:
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A'
2. 연관관계 없는 엔티티 외부 조인
- 예) 회원의 이름과 팀의 이름이 같은 대상 외부 조인
1
2
3
4
5
6
7
JPQL:
SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name
SQL:
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.username = t.name