[JPA] JSQL 프로젝션

동동·2022년 4월 24일

JPA

목록 보기
17/18
post-thumbnail

📌 프로젝션

  • 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 타입으로 조회
// Query에 type을 지정해주지 않음 
// 그럼 타입으로 Object가 들어가 있음
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]);
  • 방법 2. Object[] 타입으로 조회
// 지네릭스에 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로 바로 조회
      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());
profile
괴발개발

0개의 댓글