조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다.
join(조인 대상, 별칭으로 사용할 Q타입)

join(),innerJoin(): 내부 조인(inner join)leftJoin(): left 외부 조인(left outer join)rightJoin(): rigth 외부 조인(rigth outer join)
JPQL의on과 성능 최적화를 위한fetch조인 제공 -> 다음 on 절에서 설명
연관관계가 없는 필드로 조인

from 절에 여러 엔티티를 선택해서 세타 조인
외부 조인 불가능 다음에 설명할 조인 on을 사용하면 외부 조인 가능
ex) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회


참고: on 절을 활용해 조인 대상을 필터링 할 때, 외부조인이 아니라 내부조인(inner join)을 사용하면, where 절에서 필터링 하는 것과 기능이 동일하다. 따라서 on 절을 활용한 조인 대상 필터링을 사용할 때, 내부조인 이면 익숙한 where 절로 해결하고, 정말 외부조인이 필요한 경우에만 이 기능을 사용하자.
ex) 회원의 이름과 팀의 이름이 같은 대상 외부 조인

하이버네이트 5.1부터 on 을 사용해서 서로 관계가 없는 필드로 외부 조인하는 기능이 추가되었다. 물론 내부 조인도 가능하다.
주의! 문법을 잘 봐야 한다. leftJoin() 부분에 일반 조인과 다르게 엔티티 하나만 들어간다.
일반조인 :
leftJoin(member.team, team)
on조인 :from(member).leftJoin(team).on(xxx)

페치 조인은 SQL에서 제공하는 기능은 아니다. SQL조인을 활용해서 연관된 엔티티를 SQL 한번에 조회하는 기능이다. 주로 성능 최적화에 사용하는 방법이다.
지연로딩으로 Member, Team SQL 쿼리 각각 실행

즉시로딩으로 Member, Team SQL 쿼리 조인으로 한번에 조회

join(), leftJoin() 등 조인 기능 뒤에 fetchJoin() 이라고 추가하면 된다.
com.querydsl.jpa.JPAExpressions 사용






from 절의 서브쿼리 한계
현재 하이버네이트 6 에서 from 절 서브쿼리(인라인 뷰)는 지원하는 것으로 바뀌었지만 아직까지는 Querydsl 에서 from 절 서브쿼리(인라인 뷰)를 지원하지 않는다.
select, 조건절(where), order by에서 사용 가능


예를 들어서 다음과 같은 임의의 순서로 회원을 출력하고 싶다면?
- 0 ~ 30살이 아닌 회원을 가장 먼저 출력
- 0 ~ 20살 회원 출력
- 21 ~ 30살 회원 출력

Querydsl은 자바 코드로 작성하기 때문에
rankPath처럼 복잡한 조건을 변수로 선언해서select절,orderBy절에서 함께 사용할 수 있다.

상수가 필요하면
Expressions.constant(xxx)사용

참고: 위와 같이 최적화가 가능하면 SQL에 constant 값을 넘기지 않는다. 상수를 더하는 것 처럼 최적화가 어려우면 SQL에 constant 값을 넘긴다.

참고:
member.age.stringValue()부분이 중요한데, 문자가 아닌 다른 타입들은stringValue()로 문자로 변환할 수 있다. 이 방법은 ENUM을 처리할 때도 자주 사용한다.