코드 그라데이션

조인 (2) - ON 절 본문

Database/JPQL

조인 (2) - ON 절

완벽한 장면 2023. 8. 30. 17:53

조인 - ON 절

 

1. 조인 대상 필터링

 

예제

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 left join m.team t on t.name = 'TeamA'";
      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();
  }

}

 

 

2. 연관관계 없는 엔티티 외부 조인

 

예제

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(); // 비움

//1번      String query  = "select m from Member m left join m.team t on t.name = 'TeamA'";
      String query  = "select m from Member m left join Team t on m.username = t.name"; // 2번
      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();
  }

}

 

 

두 실행 결과 한꺼번에 비교해보면 확실히 보인다.

728x90

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

JPQL 타입 표현  (0) 2023.08.31
서브 쿼리  (0) 2023.08.31
조인 (1) - 내부 조인, 외부 조인, 세타 조인  (0) 2023.08.30
페이징 API  (0) 2023.08.30
프로젝션  (0) 2023.08.29
Comments