728x90
- 가급적 네이티브 쿼리는 사용하지 않는 게 좋음, 정말 어쩔 수 없을 때 사용
- 최근에 나온 궁극의 방법 스프링 데이터 Projections 활용
- 스프링 데이터 JPA 기반 네이티브 쿼리
- 페이징 지원
- 반환 타입
- Object[]
- Tuple
- DTO(스프링 데이터 인터페이스 Projections 지원)
- 제약
- Sort 파라미터를 통한 정렬이 정상 동작하지 않을 수 있음(믿지 말고 직접 처리)
- JPQL처럼 애플리케이션 로딩 시점에 문법 확인 불가
- 동적 쿼리 불가
네이티브 쿼리 동작



- JPQL은 위치 기반 파리 미터를 1부터 시작하지만 네이티브 SQL은 0부터 시작
- 네이티브 SQL을 엔티티가 아닌 DTO로 변환은 하려면
- DTO 대신 JPA TUPLE 조회
- DTO 대신 MAP 조회
- @SqlResultSetMapping(복잡)
- Hibernate ResultTransformer를 사용해야 함 (복잡)
- https://vladmihalcea.com/the-best-way-to-map-a-projection-query-to-a-dto-with-jpaand-hibernate/
- 네이티브 SQL을 DTO로 조회할 때는 JdbcTemplate or myBatis 권장
Projections 활용



동적 네이티브 쿼리
//given
String sql = "select m.username as username from member m";
List<MemberDto> result = em.createNativeQuery(sql)
.setFirstResult(0)
.setMaxResults(10)
.unwrap(NativeQuery.class)
.addScalar("username")
.setResultTransformer(Transformers.aliasToBean(MemberDto.class))
.getResultList();
}
- 하이버네이트를 직접 활용
- 스프링 JdbcTemplate, myBatis, jooq 같은 외부 라이브러리 사용
728x90
'실전! 스프링 데이터 JPA' 카테고리의 다른 글
| Ch01. 프로젝트 환경 설정 - 예제 도메인 모델과 동작확인 (0) | 2022.04.26 |
|---|---|
| Ch06. 나머지 기능들 - Projections (0) | 2021.12.28 |
| Ch06. 나머지 기능들 - Query By Example (0) | 2021.12.28 |
| Ch06. 나머지 기능들 - Specifications (명세) (0) | 2021.12.28 |
| Ch05. 스프링 데이터 JPA 분석 - 새로운 엔티티를 구별하는 방법 (0) | 2021.12.28 |