프로젝션이란?
select 절에 조회할 대상을 지정하는 것
프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입 ( 숫자, 문자 등 기본 데이터 타입 )
- select m from Member m → 엔티티 프로젝션
- select m.team from Member m → 엔티티 프로젝션2
- select m.address from Member m → 임베디드 타입 프로젝션
- select m.username, m.age from Member m → 스칼라 타입 프로젝션
- distinct 로 중복 제거 가능
엔티티 프로젝션
- 웬만하면 sql하고 jpql 문법하고 거의 비슷하게 명시 해야한다.( 예측이 가능하기 때문에 )
- Member에서 Team 정보를 가져올 때 1번처럼하나 2번처럼 하나 쿼리는 같게 나가지만 개발자가 쿼리를 보지 않고도 예측 가능하게 명시해주는게 좋다.
// 1번
List<Member> result = em.createQuery("select m from Member m", Member.class).getResultList();
// 2번(좋은예시)
List<Member> result = em.createQuery("select t from Member m join m.team t", Member.class).getResultList();
임베디드 타입 프로젝션
em.createQuery("select o.address from Order o", Address.class).getResultList();
스칼라 타입 프로젝션
- 스칼라는 자기가 원하는 컬럼만 뽑아서 쓰기 때문에 타입을 정해둘수가 없음 → Member 불가! (Object 타입이 기본으로 설정됨)
예시 1) Query 타입으로 조회
List 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]);
만약 object 배열 타입 캐스팅이 귀찮으면? 아래 예시 처럼 List에 Object[] 사용!
예시 2) Object[] 타입으로 조회
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로 바로 조회(DTO 생성)
- 패키지명을 포함한 전체 클래스 명 입력
- 순서와 타입이 일치하는 생성자 필요
List<MemberDTO> result = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class).getResultList();
MemberDTO memberDTO = result.get(0);
System.out.println("username : " + memberDTO.getUsername());
System.out.println("age : " + memberDTO.getAge());
페이징 API
- JPA는 페이징을 다음 두 API로 추상화 한다.
- setFirstResult(int startPosition) : 조회 시작 위치
- setMaxResults(int maxResult) : 조회할 데이터 수
List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0) // 0번째부터
.setMaxResults(10) // 10개를 가져온다
.getResultList();
'JAVA' 카테고리의 다른 글
[JAVA] fetch join (0) | 2022.01.18 |
---|---|
[JAVA] JPA 조인과 서브쿼리 (0) | 2022.01.18 |
[JAVA] 값 타입 컬렉션 (0) | 2022.01.13 |
[JAVA] 값 타입과 불변객체 (0) | 2022.01.11 |
[JAVA] 임베디드 타입(복합값) (0) | 2022.01.11 |