자바 ORM 표준 JPA 프로그래밍 기본편(김영한) 2

  • 프로젝션
    • JPQL의 경우 패키지명까지 참조해서 생성자 매핑시켜주기
      • ex) select com.myproject.myapp.dto.MemberDto(m.id, m.name) ...
      • result class 또한 DTO로 매핑
    • querydsl의 경우
      • @QueryProjection을 통해 querydsl용 생성자를 만들어서 매핑 가능
        • 이 경우, select절에 Projections.constructor(Dto.class, ...)로 매핑
        • Projections.bean과 Projections.field에 비해 연쇄 수정이 적어지는 장점이 있음

 

  • 페치 조인
    • 페치 조인은 연관관계 엔티티까지 한 번에 불러오는 것
    • 일대일 연관관계에서 주로 사용
    • 일대다 컬렉션 페치 조인은 한 번만 지원되며,
      사용 시 중복조회가 일어나기 때문에 select distinct 사용하여야함
    • @BatchSize() 또는 hibernate.default_batch_fetch_size 사용해서
      fetch join으로 불러올 엔티티 개수 지정 가능
    • 원하는 필드만 조회하거나 연관관계가 조건절에만 필요한 경우 fetch join이 아닌 일반 조인 사용할 것.

 

  • 다형성 쿼리
    • 상속 연관관계 SINGLE_TABLE 타입의 경우
      type(i) in (Book, Movie) 또는 treat(i as Book).author = 'kim' 으로 사용

 

  • 정적 재사용 쿼리
    • @SqlResultSetMapping(name = "NamedQuery 이름",
      entities = {
          @EntityResult(entityClass=Member.class,
                                         fields = { @FieldResult(name = 'id', column = 'order_id') }
                                         column이 실제 테이블 컬럼명, 타입도 지정 가능
                                        )       
          },
      columns = {@ColumnResult(name = 'item_name')}
      이것을 통해 projection 필드(가공한 필드)를 가져올 수 있음
      )
    • NamedQuery
      • 재사용 가능한 정적 쿼리 - 파라미터도 전달 가능
      • 어플리케이션 로딩 시점에 쿼리 검증함
      • @Query도 NamedQuery
      • @NamedQuery(name = "", query = "")
    • NamedNativeQuery
      • name, query, resultClass

 

  • 벌크연산
    • 변경감지만으로 데이터 수정하면 업데이트 쿼리가 남발됨.
    • update, delete, insert select 사용
    • execute하면 영향받은 엔티티수 반환
    • 벌크 연산은 DB에 직접 쿼리 날리기 때문에 영속성 컨텍스트 초기화가 필요
      @Modifying 또는 em.flush(); em.clear();

 

 

 

 

댓글을 작성해보세요.