본문 바로가기
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