
Item이 부모 객체로 다형성을 구현한 구조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')
Item과 자식 Book이 있다.//JPQL
select i from Item i
where treat(i as Book).auther = 'kim'
//SQL
select i.* from Item i
where i.DTYPE = 'B' and i.auther = 'kim'
JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다.
미리 정의해서 이름을 부여해두고 사용하는 JPQL
@Entity
@NamedQuery(
name = "Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}
List<Member> resultList =
em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
//[META_INF?persistence.xml]
<persistence-unit name="jpabook">
<mapping-file>META-INF/ormMember.xml</mapping-file>
//[META-INF/ormMember.xml]
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="htt://xmlns.jcp.org/xml/ns/persistence/orm" version="2.1">
<named-query name="Member.findByUsername">
<query>
<![CDATA[ select m from Member m where m.username = :username]]
</query>
</named-query>
</entity-mappings>
📌 Named 쿼리 환경에 따른 설정
- XML이 항상 우선권을 가진다.
- 어플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다.
SQL의 UPDATE/DELETE를 생각하면 된다!
재고가 10개 미만인 모든 상품의 가격을 10% 높여야 하는 경우를 가정해보자.
JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL이 실행되어야 한다.
① 재고가 10개 미만인 상품을 리스트로 조회한다.
② 상품 엔티티의 가격을 10% 증가한다.
③ 트랜잭션 커밋 시점에 변경 감지가 동작한다.
만약 변경된 데이터가 100건이라면 100번의 UPDATE SQL이 실행된다!!
executeUpdate()의 결과는 영향받은 엔티티 수를 반환한다.INSERT(insert into .. select, 하이버네이트 지원)벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 날린다.
그래서