본 글은 인프런의 김영한님 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편
을 수강하며 기록한 필기 내용을 정리한 글입니다.
-> 인프런
-> 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의
SELECT m FROM Member m [INNER] JOIN [m.team](http://m.team) t
엔티티를 대상으로 작성되기 때문에 참조형(m.team
)으로 표현된다.
String query = "select m from Member m inner join m.team t";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
SELECT m FROM Member m LEFT [OUTER] JOIN [m.team](http://m.team) t
String query = "select m from Member m left join m.team t";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
SELECT count(m) FROM Member m, Team t where m.username = t.name
아무 관련 없는 두 엔티티 사이에 특정 조건을 걸어서 조인을 수행하는 것.
String query = "select m from Member m, Team t where m.username = t.name";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
cross join 후 where 절에 해당하는 데이터들만 가져옴
SELECT m, t FROM Member m LEFT JOIN [m.team](http://m.team) t ON [t.name](http://t.name) = 'A'
SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.team_id = t.team_id and t.name='A'
SELECT m, t FROM Member m LEFT JOIN Team t ON m.username=t.name
m.team t
가 아닌 Team t
: 아무 관계 없는 엔티티 사이의 조인SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.username=t.name
select m from Member m where m.age > (select avg(m2.age) from Member m2)
select m from Member m where (select count(o) from Order o where m = o.member)
⇒ ⭐ FROM 절의 서브 쿼리는 현재 JPQL에서 불가능하다. → JOIN으로 풀 수 있으면 풀어서 해결해야 한다. ⭐
@ManyToOne
, @OneToOne
. 엔티티 내에서 컬렉션이 아닌 엔티티 자체를 필드로 두고 있는 것. (N : 1, 1 : 1 관계에서 연관관계 주인이 갖고 있는 대상 엔티티 필드)@ManyToMany
, @OneToMany
. 엔티티 내에서 연관관계 대상 엔티티 필드를 컬렉션으로 갖고 있는 것.select m.username from Member m
이렇게 그냥 상태 필드 자체로 끝남.m.username.~~
이렇게 더 타고 못들어감select [m.team.name](http://m.team.name) From Member m
이렇게 필드 자체로 끝나지 않고, 더 이어서 타고 들어갈 수 있다.select t.members from Team t
이렇게 member 리스트 필드를 가져옴.t.members.~~
이렇게 더 타고 들어갈 순 없다. (Collection 타입으로 반환되도록 설정되어 있어 size 정도 말고는 더 타고 들어갈 수 없다.)select m.username from Team t join t.members m
→ Team과 해당 Team의 members를 join한 후, 각 member에 접근하는 것.⭐ 묵시적 join은 안쓰는게 좋다. 그냥 명시적으로 join 시켜주는게 개발 과정에서 유지보수에 용이하다. ⭐
select [o.member.team](http://o.member.team) from Order o
→ 이렇게 활용하면 편하긴 하지만, 어느 테이블이 어떤 join column을 기준으로 join됐는지 알기 힘들어 유지보수에 어려움을 겪을 수 있다.
+조인은 SQL 튜닝에 매우 중요한 포인트인데, 묵시적 조인이 일어날 경우 조인이 일어나는 상황을 파악하기 어렵다.
⭐ 그냥 JPQL도 최대한 SQL 형식에 맞춰서 적는게 제일 깔끔하다. ⭐