자바 ORM 표준 JPA 프로그래밍 기본편(김영한) 2
2022.04.25
- 프로젝션
- JPQL의 경우 패키지명까지 참조해서 생성자 매핑시켜주기
- ex) select com.myproject.myapp.dto.MemberDto(m.id, m.name) ...
- result class 또한 DTO로 매핑
- JPQL의 경우 패키지명까지 참조해서 생성자 매핑시켜주기
-
- querydsl의 경우
- @QueryProjection을 통해 querydsl용 생성자를 만들어서 매핑 가능
- 이 경우, select절에 Projections.constructor(Dto.class, ...)로 매핑
- Projections.bean과 Projections.field에 비해 연쇄 수정이 적어지는 장점이 있음
- @QueryProjection을 통해 querydsl용 생성자를 만들어서 매핑 가능
- querydsl의 경우
- 페치 조인
- 페치 조인은 연관관계 엔티티까지 한 번에 불러오는 것
- 일대일 연관관계에서 주로 사용
- 일대다 컬렉션 페치 조인은 한 번만 지원되며,
사용 시 중복조회가 일어나기 때문에 select distinct 사용하여야함
-
- @BatchSize() 또는 hibernate.default_batch_fetch_size 사용해서
fetch join으로 불러올 엔티티 개수 지정 가능
- @BatchSize() 또는 hibernate.default_batch_fetch_size 사용해서
-
- 원하는 필드만 조회하거나 연관관계가 조건절에만 필요한 경우 fetch join이 아닌 일반 조인 사용할 것.
- 다형성 쿼리
- 상속 연관관계 SINGLE_TABLE 타입의 경우
type(i) in (Book, Movie) 또는 treat(i as Book).author = 'kim' 으로 사용
- 상속 연관관계 SINGLE_TABLE 타입의 경우
- 정적 재사용 쿼리
- @SqlResultSetMapping(name = "NamedQuery 이름",
entities = {
@EntityResult(entityClass=Member.class,
fields = { @FieldResult(name = 'id', column = 'order_id') }
column이 실제 테이블 컬럼명, 타입도 지정 가능
)
},
columns = {@ColumnResult(name = 'item_name')}
이것을 통해 projection 필드(가공한 필드)를 가져올 수 있음
)
- @SqlResultSetMapping(name = "NamedQuery 이름",
-
- NamedQuery
- 재사용 가능한 정적 쿼리 - 파라미터도 전달 가능
- 어플리케이션 로딩 시점에 쿼리 검증함
- @Query도 NamedQuery
- @NamedQuery(name = "", query = "")
- NamedQuery
-
- NamedNativeQuery
- name, query, resultClass
- NamedNativeQuery
- 벌크연산
- 변경감지만으로 데이터 수정하면 업데이트 쿼리가 남발됨.
- update, delete, insert select 사용
- execute하면 영향받은 엔티티수 반환
-
- 벌크 연산은 DB에 직접 쿼리 날리기 때문에 영속성 컨텍스트 초기화가 필요
@Modifying 또는 em.flush(); em.clear();
- 벌크 연산은 DB에 직접 쿼리 날리기 때문에 영속성 컨텍스트 초기화가 필요
댓글을 작성해보세요.