본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다.
조인
// 내부 조인
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
- 내부 조인 : 조인 대상(team)이 없으면 데이터(member)를 출력하지 않는다.
- 외부 조인 : 조인 대상(team)이 없어도 데이터(member)를 출력한다.
- 세타 조인 : 막 쿼리
내부(이너) 조인
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);
Team team = new Team();
team.setName("teamA");
team.addMember(member); // 연관관계 편의 메서드 호출
em.persist(team);
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();
Hibernate:
/* select
m
from
Member m
inner join
m.team t */ select
... 생략
from
Member member0_
inner join
Team team1_
on member0_.team_id=team1_.team_id limit ?
Hibernate:
select
... 생략
from
Team team0_
where
team0_.team_id=?
실행해보니 사용하지도 않았는데 team을 조회하는 쿼리가 하나 더 나간 것을 알 수 있다.
이러한 이유 때문에 @ManyToOne은 항상 Lazy(지연로딩)로 설정해줘야 한다는 주의점이 있다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
inner 키워드는 생략이 가능하다.
String query = "select m from Member m join m.team t";
외부 조인
String query = "select m from Member m left outer join m.team t";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
/* select
m
from
Member m
left join
m.team t */ select
... 생략
from
Member member0_
left outer join
Team team1_
on member0_.team_id=team1_.team_id limit ?
left outer join된 것을 확인할 수 있다.
outer 키워드는 생략이 가능하다.
String query = "select m from Member m left join m.team t";
세터 조인
String query = "select m from Member m, Team t where m.username = t.name";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
/* select
m
from
Member m,
Team t
where
m.username = t.name */ select
... 생략
from
Member member0_ cross
join
Team team1_
where
member0_.username=team1_.name
cross join 된 것을 확인할 수 있다.
조인 - ON절
- JPA는 ON절을 활용한 조인을 지원한다. (JPA 2.1부터 지원)
- ON절을 이용해 조인 대상을 필터링할 수 있다.
- ON절을 이용해 연관관계가 없는 엔티티를 외부 조인할 수 있다. (하이버네이트 5.1부터 지원)
👉🏻 조인 대상 필터링
ex) 회원과 팀을 조인하는데, 팀 이름이 A인 팀만 조인하려는 경우
select m, t from Member m left join m.team t on t.name = 'A'
👉🏻 연관관계가 없는 엔티티 외부 조인
ex) 회원의 이름과 팀의 의름이 같은 대상을 외부 조인하려는 경우
select m, t from Member m left join Team t on m.username = t.name
Reference
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] JPA 설정 총 정리 : ddl-auto 옵션, 실행 쿼리 보기(SpringBoot 3.x 버전 변경 추가) (1) | 2023.04.19 |
---|---|
[JPA] Auditing 기능을 사용해 공통 칼럼(등록일, 수정일 등) 관리하기 (0) | 2023.04.03 |
[JPA] OSIV (0) | 2022.12.27 |
[JPA] JPQL : 서브 쿼리 (0) | 2022.11.06 |
[JPA] JPQL : 페이징 (0) | 2022.11.03 |
[JPA] JPQL : 기본 문법 (0) | 2022.10.29 |
[JPA] JPA가 지원하는 쿼리 방법 (JPQL, Criteria, QueryDsl) (0) | 2022.10.29 |
[JPA] 값 타입 (0) | 2022.10.19 |