[JPA] 프로젝션 :: 잡다한 프로그래밍
반응형

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

+ Recent posts