출처
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
목차
조인
SQL과 비슷하지만 객체 중심이라는 차이점이 있습니다.
내부조인
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
member.setTeam(team);
em.persist(member);
em.flush();
em.clear();
String query = "select m from Member m inner join m.team t";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
tx.commit();
Hibernate:
select
member.id,
member.age,
member.TEAM_ID,
member.username
from
Member m
inner join
Team team
on
member.TEAM_ID = team.id
--참고로, Member의 ManyToOne의 fetch 전략을 LAZY로 변경해야 다음 쿼리가 나가지 않습니다.
Hibernate:
select
id,
name
from
Team team
where
team.id=?
외부 조인
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
세타 조인
select count(m) from Member m, Team t where m.username = t.name
- 서로 연관관계가 없는 컬럼으로 인한 조인입니다.
- Member의 username과 Team의 name은 서로 PK나 FK가 아니지만, 카테시안 곱을 사용해 조인할 수 있습니다.
select
member.id,
member.age,
member.TEAM_ID,
member.username
from
Member member
cross join //카테시안 곱
Team team
where
member.username = team.name
ON 절
ON절을 활용한 조인을 지원합니다. (JPA 2.1부터 지원)
- 조인 대상 필터링
- 연관관계가 없는 엔티티 외부 조인 (하이버네이트 5.1부터)
1. 조인 대상 필터링
예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인
//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. 연관관계가 없는 엔티티 외부 조인
예) 회원의 이름과 팀의 이름이 같은 대상 외부 조인
//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
'Backend > JPA' 카테고리의 다른 글
[JPQL] 서브 쿼리 (0) | 2023.12.24 |
---|---|
[JPQL] 벌크 연산 (0) | 2023.12.24 |
[JPQL] 프로젝션 (0) | 2023.12.24 |
[JPQL] 객체 지향 쿼리 기본 문법과 기능 (0) | 2023.12.24 |
[JPA] JPA의 다양한 쿼리 방법 소개 (0) | 2023.12.24 |