JAVA

[JAVA] 프로젝션과 페이징

응디 2022. 1. 13. 18:01

프로젝션이란?

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