본문 바로가기
Backend/JPA

[JPQL] 조인

by 2245 2023. 12. 24.

출처

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런

현업에서 실제로 JPA로 개발을 하고 있습니다. 그런 입장에서보면 지금 작성하고 있는 코드들이 어떻게 작동하는지 이해하는데 큰 도움을 주는 강의입니다. 다음은 제가 느낀 이 강의의 장점들

www.inflearn.com

 

 

조인

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부터 지원)

  1. 조인 대상 필터링
  2. 연관관계가 없는 엔티티 외부 조인 (하이버네이트 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