💠 다형성 쿼리
- 조회 대상을 특정 자식으로 한정
EX) Item 중에 하위 클래스인 Book, Movie를 조회하라
ㆍ[JPQL] - SELECT i FROM Item i WHERE type(i) IN (Book, Movie)
ㆍ[SQL] - SELECT i FROM i where i.DTYPE in ('B', 'M')
💠 엔티티 직접 사용
- JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다.
ㆍ[JPQL]
SELECT count(m.id) FROM Member m // 엔티티의 아이디를 사용
SELECT count(m) FROM Member m // 엔티티를 직접 사용
- 함수에서 아이디를 사용하던, 엔티티를 직접 사용하던 SQL에서는 Id를 이용하여 데이터를 가져온다.
ㆍ[SQL] (JPQL 둘 다 같은 SQL 실행)
SELECT count(m.id) as cnt from Member m
💠 Named 쿼리
- 미리 정의해서 이름을 부여해두고 사용하는 JPQL (쿼리를 함수처럼 사용)
- 정적 쿼리
- 어노테이션, XML에 정의 할 수 있음
- 애플리케이션 로딩 시점에 초기화 후 재사용 (로딩 시점에 SQL로 파싱하고 캐싱)
- 애플리케이션 로딩 시점에 쿼리를 검증 할 수 있음 (잘못된 쿼리일 경우 오류를 내뿜음 / 컴파일 단계에서 바로)
- Spring Data JPA에서는 @Query 를 사용하면 @NamedQuery 처럼 컴파일시점에 쿼리 오류를 잡아줌.
💠벌크 연산
( 예시 )
ㆍ재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면?
ㆍJPA 변경 감지 기능 (더티체킹) 으로 실행하려면 너무 많은 SQL 실행.
- 1. 재고가 10개 미만인 상품을 리스트로 조회한다. (영속성 컨텍스트에 저장)
- 2. 상품 엔티티의 가격을 10% 증가한다.
- 3. 트랜잭션 커밋 시점에 변경감지가 동작한다.
ㆍ변경된 데이터가 100건이라면 100번의 UPDATE SQL 실행.
🧧 벌크 연산 주의
- 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리 하기 때문에, 영속성 컨텍스트와 실제 DB 데이터가 다름.
( 벌크 연산시 실제 쿼리가 DB에 날라감 / FLUSH 자동 호출 )
1. 벌크 연산을 먼저 실행 하거나,
2. 이미 불러온 데이터가 있을 때, 벌크 연산 수행 후 영속성 컨텍스트 초기화를 해준다.
( em.clear() - 영속성 컨텍스트 초기화 이후, [em.find()] DB에서 데이터를 불러와서 사용. )
본 게시글은 김영한님의 Inflearn 강의를 토대로 제작되었습니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com