JPA-06 JPQL 02

yj k·2023년 4월 11일
0

jpa

목록 보기
8/14

프로젝션(projection)

SELECT 절에 조회할 대상을 지정하는 것을 프로젝션이라고 한다.
(SELECT {프로젝션 대상} FROM)

프로젝션 대상은 4가지 방식이 있다.

1. 엔티티 프로젝션
원하는 객체를 바로 조회할 수 있다.
조회된 엔티티는 영속성 컨텍스트가 관리한다.

2. 임베디드 타입 프로젝션
(임베디드 타입에 대한 설명은 MenuInfo 클래스에서 설명)
엔티티와 거의 비슷하게 사용되며 조회의 시작점이 될 수 없다. -> from 절에 사용 불가
임베디드 타입은 영속성 컨텍스트에서 관리되지 않는다.

3. 스칼라 타입 프로젝션
숫자, 문자, 날짜 같은 기본 데이터 타입이다.
스칼라 타입은 영속성 컨텍스트에서 관리되지 않는다.

4. new 명령어를 활용한 프로젝션
다양한 종류의 단순 값들을 DTO로 바로 조회하는 방식으로 new 패키지명.DTO명을 쓰면 해당 DTO로 바로 반환받을 수 있다.
new 명령어를 사용한 클래스의 객체는 엔티티가 아니므로 영속성 컨텍스트에서 관리되지 않는다.


1. 엔티티 프로젝션

SELECT m FROM Member m	//회원
SELECT m.team FROM Member m  //팀

둘 다 엔티티를 프로젝션 대상으로 조회
원하는 객체를 바로 조회한 것
컬럼을 하나하나 나열해서 조회해야하는 SQL과 차이가있음


2. 임베디드 타입 프로젝션

임베디드 타입(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;
    ...생략

3. 스칼라 타입 프로젝션

스칼라 타입은 영속성 컨텍스트에서 관리되지 않는다.


4. new 명령어를 활용한 프로젝션

new 패키지명.DTO명을 쓰면 해당 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);
    }
    

0개의 댓글