SELECT 절에 조회할 대상을 지정하는 것을 프로젝션이라고 한다.
(SELECT {프로젝션 대상} FROM)
1. 엔티티 프로젝션
원하는 객체를 바로 조회할 수 있다.
조회된 엔티티는 영속성 컨텍스트가 관리한다.
2. 임베디드 타입 프로젝션
(임베디드 타입에 대한 설명은 MenuInfo 클래스에서 설명)
엔티티와 거의 비슷하게 사용되며 조회의 시작점이 될 수 없다. -> from 절에 사용 불가
임베디드 타입은 영속성 컨텍스트에서 관리되지 않는다.
3. 스칼라 타입 프로젝션
숫자, 문자, 날짜 같은 기본 데이터 타입이다.
스칼라 타입은 영속성 컨텍스트에서 관리되지 않는다.
4. new 명령어를 활용한 프로젝션
다양한 종류의 단순 값들을 DTO로 바로 조회하는 방식으로 new 패키지명.DTO명을 쓰면 해당 DTO로 바로 반환받을 수 있다.
new 명령어를 사용한 클래스의 객체는 엔티티가 아니므로 영속성 컨텍스트에서 관리되지 않는다.
SELECT m FROM Member m //회원
SELECT m.team FROM Member m //팀
둘 다 엔티티를 프로젝션 대상으로 조회
원하는 객체를 바로 조회한 것
컬럼을 하나하나 나열해서 조회해야하는 SQL과 차이가있음
임베디드 타입(embedded type, 복합 값 또는 내장 타입
새로운 값 타입을 직접 정의한 것으로 주로 기본 값 타입을 모아서 만든 하나의 타입을 말한다.
엔티티의 필드 중 일부분을 하나의 임베디드 타입으로 정의하면 알아보기 쉽고, 재사용성이 높게 디자인 할 수 있어 유지보수에 용이하다.
@Embeddable
@Embeddable
: 값 타입을 정의하기 위한 어노테이션
복합 키를 정의할 클래스 상단에 붙인다.
@Embeddable
public class MenuInfo {
@Column(name="MENU_NAME")
private String menuName;
@Column(name="MENU_PRICE")
private int menuPrice;
...생략
@Embedded
@Embedded
: 값 타입을 사용하는 곳에 적용
복합 키를 사용하는 필드 상단에 붙인다.
public class EmbbededMenu {
@Id
@Column(name="MENU_CODE")
private int menuCode;
@Embedded
private MenuInfo menuInfo;
...생략
스칼라 타입은 영속성 컨텍스트에서 관리되지 않는다.
new 패키지명.DTO명을 쓰면 해당 DTO로 바로 반환받을 수 있다.
활용법
@Test
public void new_명령어를_활용한_프로젝션_테스트() {
//when
String jpql = "SELECT new com.greedy.section03.projection.CategoryInfo(c.categoryCode, c.categoryName) FROM section03_category c";
//new 패키지명.DTO명
List<CategoryInfo> categoryInfoList = entityManager.createQuery(jpql, CategoryInfo.class).getResultList();
//then
assertNotNull(categoryInfoList);
categoryInfoList.forEach(System.out::println);
}