코드 그라데이션

조인 (1) - 내부 조인, 외부 조인, 세타 조인 본문

Database/JPQL

조인 (1) - 내부 조인, 외부 조인, 세타 조인

완벽한 장면 2023. 8. 30. 13:15

조인

  • SQL의 조인과 양상은 비슷하나 얘는 엔티티 중심으로 동작한다.
  • 약간 객체 스타일로 조인 문법이 나간다. 연관있는 것을 . 으로 표현한다.
  • 간단히 복기하고 넘어가면 내부조인은 값이 없으면 그대로 안 나오지만, 외부조인은 한쪽의 값이라도 있으면 없는 쪽은 빠진 채로 출력됨.

 

예제

Member에 Team getter, setter 먼저 추가 후, Team에도 Member의 getter, setter 추가 후 작업

Member에 Lazy로 전략 명기

@ManyToOne(fetch = FetchType.LAZY) // 중요.
@JoinColumn(name = "TEAM_ID")
private Team team;

 

Member - 연관관계 편의 메서드 추가

public void changeTeam(Team team) {
  this.team = team;
  team.getMembers().add(this);
}

 

 

JpqlMain

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      // 팀 먼저 저장
      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);

      Member member = new Member();
      member.setUsername("member1");
      member.setAge(10);
      em.persist(member);

      member.setTeam(team); // 연관관계 편의 메서드 만들러 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();

      System.out.println("result.size = " + result.size());

      for (Member member1 : result) {
        System.out.println("member1 = " + member1);
      }

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }

}

 

실행하면

Team을 조인 해서 가져온다.

 

이제부터는 팀을 가져오거나 파라미터로 받아오는 등의 작업들을 자유롭게 할 수 있다.

 

 

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";

 

만약 진짜 username과 team이름이 같은 게 있다고(teamA라는 이름) 바꿔버리면

이렇게 찍으면

진짜로 출력됨...!

 

 

728x90

'Database > JPQL' 카테고리의 다른 글

서브 쿼리  (0) 2023.08.31
조인 (2) - ON 절  (0) 2023.08.30
페이징 API  (0) 2023.08.30
프로젝션  (0) 2023.08.29
JPQL 소개  (0) 2023.08.28
Comments