반응형
JPA에서 프로젝션(Projection)은
SELECT 절에서 어떤 데이터를 조회할지 명시하는 것을 말합니다.
프로젝션의 3가지 대상
엔티티 프로젝션
String jpql = "SELECT m FROM Member m";
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
- 영속성 컨텍스트 관리 대상 → result 안에 들어있는 각 Member는 수정 시 dirty checking 되어 UPDATE 발생
연관된 엔티티 조회 (Team)
String jpql = "SELECT m.team FROM Member m";
List<Team> result = em.createQuery(jpql, Team.class).getResultList();
주의: 내부적으로 JOIN 발생
추천 방식은 아래처럼 명시적 JOIN으로 작성 (쿼리랑 비슷해야 예측이 가능함)
String jpql = "SELECT t FROM Member m JOIN m.team t";
List<Team> result = em.createQuery(jpql, Team.class).getResultList();
임베디드 타입 프로젝션
String jpql = "SELECT o.address FROM Order o";
List<Address> result = em.createQuery(jpql, Address.class).getResultList();
더보기
해당 Address 객체는 영속성 컨텍스트 상태인가?
=> 즉 변경하면 update쿼리 나가?
안나감! Embedded는 값타입이니까!
=> 얘는 영속성 컨텍스트 돼? 찾아보기
스칼라 타입 프로젝션
// 강의에서 설명한 쿼리방식은 생략 너무 보기 불편함
String jpql = "SELECT m.username, m.age FROM Member m";
List<Object[]> result = em.createQuery(jpql).getResultList();
for (Object[] row : result) {
String username = (String) row[0];
int age = (int) row[1];
}
new 명령어로 DTO 직접 조회
String jpql = "SELECT NEW com.example.dto.MemberDto(m.username, m.age) FROM Member m";
List<MemberDto> result = em.createQuery(jpql, MemberDto.class).getResultList();
- 단순 값을 DTO로 바로 조회
- 패키지명 포함한 전체 클래스명 필수
- DTO에는 해당 생성자가 있어야 함
반응형
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] 페이징, 조인, 서브쿼리 등 (3) | 2025.07.31 |
---|---|
[JPA] JPQL 기본 문법과 기능 (2) | 2025.07.30 |
[JPA] JPQL 소개 (2) | 2025.07.30 |
[JPA] 값 타입 컬렉션 (1) | 2025.07.25 |
[JPA] 값 타입과 불변 객체 (2) | 2025.07.23 |