ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA (JPQL) (3) join
    카테고리 없음 2023. 4. 20. 09:52
    어제 스프링캠프를 갔다왔다. 아주 좋았다. 커피도 주고 밥도 주고 혼자라 심심한거 빼곤 좋은 경헙이었다. 아주 만족한다. 좋은 강의도 많이 듣고 내년에도 꼭가야지 이번 시간엔 jpql의 join에 대해 알아 보자. JPQL은 일반 SQL과 기능은 같지만 문법만 약간 다르다.

    내부 조인

    우리가 흔히 쓰는 SQL의 inner join이다. inner는 생략 가능 하다. 한번보자.
    String team = "team1";
    String query = "select m from Member m inner join m.team t where t.name = :teamName";
    
    List<Member> members = entityManager.createQuery(query,Member.class)
      .setParameter("teamName", team)
      .getResultList();
    System.out.println(
      members.stream().map(i -> i.toString()).collect(joining("\
    "))
    );
    
    중요한건 저 query이다. 저기 보면 t.team이 있는데 이것은 연관관계의 필드이다. 만약 ** .. Member m join Team t ** 라고 하면 에러가 발생한다. 그것만 주의하자!

    외부 조인

    외부 조인도 기능은 일반 SQL 외부 조인과 같다. 문법을 살펴보자
    select m from Member m left [outer] join m.team t
    
    보통은 outer를 생략 가능해서 left join이라고 사용한다.
    String query = "select m from Member m left join m.team t where t.name = :teamName";
    List<Member> members = entityManager.createQuery(query,Member.class)
      .setParameter("teamName", "team1")
      .getResultList();
    System.out.println(
      members.stream().map(i -> i.toString()).collect(joining("\
    "))
    );
    
    내부 조인과 비슷하기 때문에 더이상의 내용은 생략한다.

    컬렉션 조인

    회원 -> 팀 으로 조인을 하면 다대일 조인이면서 단일 값 연관 필드를 사용한다. (m.team) 하지만 회원 -> 팀을 조인하면 일대다 를 조인하면서 컬렉션 연관 필드를 사용한다. (t.members)
    String query = "select t, m from Team t inner join t.members m";
    List<Object[]> objects = entityManager.createQuery(query)
      .getResultList();
    
    objects.forEach(i -> {
      Team team = (Team) i[0];
      Member member = (Member) i[1];
      System.out.println(team);
      System.out.println(member);
    });
    

    세타 조인

    세타 조인은 전혀 관계 없는 엔티티도 조인할 수 있다. Where절에서만 사용가능하고 내부조인만 지원한다.
    String query = "select m from Member m , Team t where t.name = m.name";
    List<Member> members = entityManager.createQuery(query,Member.class)
      .getResultList();
    System.out.println(
      members.stream().map(i -> i.toString()).collect(joining("\
    "))
    );
    
    위의 소스를 보면 전혀 관계없는 팀명과 이름을 조인 하였다. 그래도 사용가능하다.
    select m from Member m, Team t 
    
    위의 문법처럼 사용 하면 된다. 다음시간에는 페치 조인에 대해서 알아보자. 페치 조인은 이번시간에 포스팅 한거 만큼 있다. 한편으로 만들어야 겠다. 월요병 안걸리라면 일찍 자야지 출처 : 자바 ORM 표준 JPA 프로그래밍 (김영한)

    댓글

Designed by Tistory.