해당 시리즈는 김영한님의 JPA 로드맵을 따라 학습하면서 내용을 정리하는 글입니다
SELECT m.username -> 상태 필드
FROM Member m
JOIN m.team t -> 단일 값 연관 필드
JOIN m.orders o -> 컬렉션 값 연관 필드
WHERE t.name = '팀A'
@ManyToOne
, @OneToOne
, 대상이 엔티티@OneToMany
, @ManyToMany
, 대상이 컬렉션JPQL
: SELECT o.member FROM Order o
SQL
: SELECT m.* FROM Orders o Inner JOIN Member m on o.member_id = m.id
JOIN
키워드 직접 사용SELECT m FROM Member m JOIN m.team t
SQL
조인 발생(내부 조인만 가능)SELECT m.team FROM Member m
SELECT
, WHERE
절에서 사용하지만 묵시적 조인으로 인해 SQL
의 FROM
(JOIN) 절에 영향을 줌SQL
튜닝에 중요한 포인트SQL
조인의 종류가 아닙니다JPQL
에서 성능 최적화를 위해서 제공하는 기능입니다JOIN FETCH
명령어를 사용합니다[LEFT | INNER] JOIN FETCH
조인경로SQL
을 보면 회원 뿐만 아니라 팀(T.*)도 함께 SELECTSELECT m FROM Member m JOIN FETCH m.team
SELECT M.*, T.* FROM Member m INNER JOIN Team t ON m.TEAM_ID = t.id
SELECT t
FROM Team t JOIN FETCH t.members
WHERE t.name = '팀A'
SELECT t.*, m.*
FROM Team t
INNNER JOIN Member m ON T.id = m.TEAM_ID
WHERE t.name = '팀A'
SQL
의 DISTINCT
는 중복된 결과를 제거하는 명령JPQL
의 DISTINCT
는 2가지 기능을 제공합니다SQL
에 DISTINCT
를 추가SELECT DISTINCT t
FROM Team t JOIN FETCH t.members
WHERE t.name = '팀A'
SQL
한 번으로 조회가능합니다 - 성능 최적화@OneToMany(fetch = FetchType.LAZY)
DTO
로 반환하는 것이 효과적입니다Item
중에 Book
, Movie
를 조회해라SELECT i FROM Item i
WHERE type(i) IN (Book, Movie)
SELECT i FROM Item i
WHERE i.DTYPE in ('B', 'M')
FROM
, WHERE
, SELECT(하이버네이트 지원)
사용Item
과 자식 Book
SELECT i FROM Item i
WHERE TREAT(i as Book).author = 'kim'
SELECT i.* FROM Item i
WHERE i.DTYPE = 'B' and i.author = 'kim'
JPQL
에서 엔티티를 직접 사용하면 SQL
에서 해당 엔티티의 기본 키 값을 사용합니다SELECT COUNT(m.id) FROM Member m //엔티티의 아이디를 사용
SELECT COUNT(m) FROM Member m //엔티티를 직접 사용
SELECT COUNT(m.id) AS cnt FROM Member m
JPQL
XML
에 정의XML
이 항상 우선권을 가집니다XML
을 배포할 수 있습니다JPA
변경 감지 기능으로 실행하려면 너무 많은 쿼리가 실행되게 됩니다UPDATE SQL
이 실행됩니다String qlString = "UPDATE Product p " +
"SET p.price = p.price * 1.1 " +
"WHERE p.stockAmount < :stockAmount";
int resultCount = em.createQuery(qlString)
.setParameter("stockAmount", 10)
.executeUpdate();