본문 바로가기

개발중/Java Persistence API (JPA)

JPA - 프로젝션

728x90
반응형

프로젝션 ?

SELECT 절에 조회할 대상을 지정하는 것을 프로젝션이라 하고

 

{ SELECT {프로젝션 대상} FROM } 으로 대상을 선택한다.


🔴 프로젝션 대상

  • 엔티티
  • 엠비디드 타입
  • 스칼라
    • 숫자, 문자 등 기본 데이터 타입

🔴 엔티티 프로젝션

SELECT m        FROM Member m

SELECT m.team FROM Member m

 

둘 다 엔티티를 프로젝션 대상으로 사용한다.

 

쉽게 생각하면 원하는 객체를 바로바로 조회한다는 것이다.

컬럼을 하나하나 나열에서 조회해야 하는 SQL 과 차이가 있다.

 

참고로 이렇게 조회한 엔티티는 영속성 컨텍스트에서 관리 된다.


🔴 임베디드 타입 프로젝션

JPQL 에서 임베디드 타입은 엔티티와 거의 비슷하게 사용된다.

 

임베디드 타입은 조회의 시작점이 될 수 없다는 제약이 있다.

다음은 임베디드 타입인 Address 를 조회의 시작점으로 사용해서 잘못된 쿼리다.

 

String query = "SELECT a FROM Adress a"

 

다음 코드에서 Order 엔티티가 시작점이다.

이렇게 엔티티를 통해서 임베디드 타입을 조회할 수 있다.

 

String query = "SELECT o.address FROM Order o"

List<Address> addresses = em.createQuery( query, Address.class ).getResultList();

 

실행된 SQL 은 다음과 같다.

 

SELECT order.city

          , order.street

          , order.zipcode

  FROM Orders order

 

임베디드 타입은 엔티티 타입이 아닌 값 타입이다.

따라서 이렇게 직접 조회한 임베디드 타입은 영속성 컨텍스트에서 관리되지 않는다.


🔴 스칼라 타입 프로젝션

숫자, 문자, 날짜와 같은 기본 데이터 타입들을 스칼라 타입이라 한다.

예를 들어 전체 회원의 이름을 조회하려면 다음처럼 쿼리하면 된다.

 

List <String> usernames = em.createQuery("SELECT username FROM Member m", String.class ).getResultList();


 

728x90
반응형

'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글

[JPA] 연관 관계 정리  (0) 2021.08.15
JPQL JOIN  (0) 2021.07.01
JPA - 결과 조회 getResultList/getSingleResult  (0) 2021.07.01
JPA - 파라미터 바인딩  (0) 2021.07.01
🟡 Criteria이란 ?  (0) 2021.07.01