📌 프로젝션
- SELECT 절에 조회할 대상을 지정하는 것
- 프로젝션 대상
엔티티 / 임베디드 타입 / 스칼라 타입(숫자, 문자 등 기본 데이터 타입)
- 프로젝션은 모두 영속성 컨텍스트에서 관리됨
- SELECT m FROM Member m -> 엔티티 프로젝션
- SELECT m.team FROM Member m -> 엔티티 프로젝션
- SELECT m.address FROM Member m -> 임베디드 타입 프로젝션
- SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션
- DISTINCT로 중복 제거
🚧 프로젝션 - 여러 값 조회(다양한 타입의 값 조회)
- SELECT m.username, m.age FROM Member m
- 방법 1. Query 타입으로 조회
List<Member> resultList = em.createQuery("select m.username, m.age from Member m")
.getResultList();
Object o = resultList.get(0);
Object[] result = (Object[]) o;
System.out.println("username = " + result[0-]);
System.out.println("age = " + result[1]);
List<Object[]> resultList = em.createQuery("select m.username, m.age from Member m")
.getResultList();
Object[] result = resultList.get(0);
System.out.println("username = " + result[0-]);
System.out.println("age = " + result[1]);
- 방법 3. new 명령어로 조회
- 단순 값을 DTO로 바로 조회
SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
- 패키지명을 포함한 전체 클래스명을 입력해야 함
- 순서와 타입이 일치하는 생성자 필요
List<MemberDTO> resultList = em.createQuery("select new jpql.MemberDTO( m.username, m.age) from Member m", MemberDTO.class)
.getResultList();
MemberDTO memberDTO = resultList.get(0);
System.out.println("username = " + memberDTO.getUsername());
System.out.println("age = " + memberDTO.getAge());