객체지향 쿼리 언어 - 조인(JOIN)

도윤·2024년 3월 22일
post-thumbnail

조인(JOIN)

내부 조인(INNER JOIN)

SELECT m FROM Member m [INNER] JOIN m.team t

JPQL 조인은 엔티티 중심으로 동작을 한다. Member 와 연관있는 Team 을 m.team 과 같이 점(.)으로 표현하고 별칭을 t 로 준다.
참고로 내부 조인은 Member는 있는데 team 데이터가 없을 경우에 Member만 나온다.

Member 와 Team 의 양방향 연관관계를 위해 Member 클래스와 연관 관계 편의 메서드를 작성한다.

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

그리고 실행해보자.

위와 같이 JOIN 외에 SELECT 쿼리가 추가적으로 나간 것을 볼 수 있다. 이 부분은 지연 로딩 설정으로 해결 할 수 있다.

  • 참고로 JPQL 의 inner 키워드는 생략이 가능하다.
String query = "selectd m from Member m join m.team t"

외부 조인(OUTER JOIN)

SELECT m FROM Member m LEFT [OUTER] JOIN m.team t

외부조인은 Member 만 있고 Team 이 없는 경우에 Team 을 다 NULL 로 채워줘 Member 와 Team 이 같이 나오게 된다.

String query = "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 와 Team 을 카티션 곱으로하고 where 절에 조건을 걸어주는 것이다.
세타 조인의 쿼리는 아래와 같이 from 절에 객체를 쭉 써주고 where절에 조건을 걸어주면 된다.

String query = "select m from Member m, Team t where m.username = t.name";

맞게 실행됐나를 확인하기 위해 이상하지만 예제를 조금 손 보고 실행해보자.

조인 - ON 절

  • ON 절을 활용한 조인(JPA 2.1 부터 지원)
    • 조인 대상 필터링
    • 연관관계 없는 엔티티 외부 조인(하이버네이트 5.1부터)

조인 대상 필터링

  • ex) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인
  • JPQL
SELECT m, t FROM Member m LEFT JOIN m.team to 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'

연관관계가 없는 엔티티 외부 조인

  • ex) 회원의 이름과 같이 팀의 이름이 같은 대상 외부 조인
  • JPQL
SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name
  • SQL
SELECT m.*, t.* FROM
Member m LEFT JO IN Team t ON m.username = t.name

참고 : 자바 ORM 표준 JPA 프로그래밍

profile
기록은 기억을 이긴다⭐

0개의 댓글