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 쿼리가 추가적으로 나간 것을 볼 수 있다. 이 부분은 지연 로딩 설정으로 해결 할 수 있다.
String query = "selectd m from Member m join m.team t"
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";
맞게 실행됐나를 확인하기 위해 이상하지만 예제를 조금 손 보고 실행해보자.
조인 대상 필터링
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'
연관관계가 없는 엔티티 외부 조인
SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name
SELECT m.*, t.* FROM
Member m LEFT JO IN Team t ON m.username = t.name
참고 : 자바 ORM 표준 JPA 프로그래밍