-
JPA (11) - 다형성 쿼리,엔티티 직접 사용,정적쿼리,벌크연산Web/JPA 2024. 1. 12. 14:40
1. 다형성 쿼리
- TYPE
> 조회 대상을 특정 자식으로 한정 (ex Item 중에 Book, Movie를 조회하라)
select i from Item i where type(i) IN (Book, Movie)
> 자바의 타입 캐스팅과 유사하다.
> 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 (FROM, WHERE, SELECT에서 사용)
select i from Item i where treat(i as Book).author = 'kim'
2. 엔티티 직접 사용
> JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티 기본 키 값을 사용한다.
select count(m.id) from Member m //엔티티 아이디를 사용 select count(m) from Member m //엔티티 직접 사용
- 파라미터에 직접 사용
String jpql = "select m from Member m where m =: member"; List resultList = em.createQuery(jpql).setParameter("member",member).getResultList();
- 외래 키 값 직접 사용
String sql = "select m from Member m where m.team = :team"; List resultList = em.createQuery.(sql).setParameter("team",team).getResultList();
3. 정적쿼리
> 미리 정의해서 이름을 부여해두고 사용하는 JPQL
> 정적 쿼리
> 어노테이션, XML에 정의
> 애플리케이션 로딩 시점에 초기화 후 재사용한다.
> 애플리케이션 로딩 시점에 쿼리 검증
@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();
*XML은 필요시 찾아보자
> XML이 항상 우선권가짐, 애플리케이션 운영 환경에 따라 다른 XML 배포 가능
4. 벌크 연산
> JPA 변경 감지 기능으로 너무 많은 SQL이 실행될 때 해결법
> 패치조인이 조인 한번으로 모두 연관관계 모두 읽듯이, 쿼리 한번으로 로우를 변경한다.(엔티티)
em.createQuery("upadte Member m set m.age = 20").executeUpdate();
> executeUpdate()의 결과는 영향받은 엔티티 수 반환
> UPDATE,DELETE,INSERT 지원한다.
> 기존 sql에 update delete insert처럼 작성
* 주의점 벌크연산은 영속성 컨텍스트 무시하고 데이터 베이스에 직접 쿼리를 날린다.
> 따라서 영속성 컨텍스트를 비우고 벌크 연산하고 초기화 (강제로 flush(),clear() 하고 벌크연산하고 다시 불러오라)
> 만약 1차캐쉬에 기존 값이 남아 있다면, findMember해도 소용없다.(em.find()) -> clear한 다음에 find해야한다.
> 즉 벌크 연산을 먼저 수행하고, 영속성 컨텍스트를 초기화하십시오
'Web > JPA' 카테고리의 다른 글
JPA(2) - OSIV (0) 2024.01.22 JPA (2) - API 개발 시 기본으로 지켜야 할 사항 (0) 2024.01.22 JPA - 프로젝트 생성 (0) 2024.01.11 JPA 활용 (1-3) - 엔티티 설계시 주의점 (0) 2024.01.04 JPA 활용 (1-2) - 도메인 분석 설계 (0) 2024.01.04