💡 벌크 연산
- PK를 특정한 엔티티의 Update, Delete를 제외한 모든 Update, Delete 쿼리이다.
- 쿼리 한 번으로 여러 테이블의 Row를 변경한다. (Entity)
- executeUpdate()의 결과는 영향을 받은 Entity의 수를 반환한다.
- Insert 문을 Hibernate에서 지원한다. (insert into .. select)
// 재고가 10개 미만인 Product의 Price를 쿼리 한 번으로 10% 인상
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();
주의점
벌크연산은 영속성 컨텍스트를 무시하고 DB에 직접 쿼리한다. (데이터 정합성)
2가지 해결 방법
- 벌크 연산을 먼저 실행
- 벌크 연산 실행 후 영속성 컨텍스트 초기화 (em.clear())
💡 엔티티 직접 사용
JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다.
엔티티를 직접 사용하거나 파라미터로 넘겨도 동일하게 PK로 조회한다.
# 엔티티의 아이디를 사용
select count(m.id) from Member m
# 엔티티를 직접 사용
select count(m) from Member m
# 엔티티를 파라미터로 전달
select m from Member m where m = :member
# 식별자를 직접 전달
select m from Member m where m.id = :memberId
'📦 Database > JPQL' 카테고리의 다른 글
JPQL Join & Fetch Join (0) | 2023.04.16 |
---|---|
JPQL 경로 표현식 (0) | 2023.04.16 |
JQPL 다형성 쿼리 & 결과 조회 API (0) | 2023.04.16 |
JPQL Named Query & Parameter Binding (0) | 2023.04.16 |
JPQL Paging API (0) | 2023.04.16 |