ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA (11) - 다형성 쿼리,엔티티 직접 사용,정적쿼리,벌크연산
    Web/JPA 2024. 1. 12. 14:40

     

     

    1. 다형성 쿼리

    출처: JAP기본편(김영한) - 인프런

     

    - 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 활용 (1) - 프로젝트 환경설정  (1) 2024.01.04
Designed by Tistory.