JPQL Projection

2023. 4. 16. 00:59·📦 Database/JPQL

💡 프로젝션

Select에 조회할 대상을 지정하는 것이다.

프로젝션의 대상은 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)이다.

프로젝션 조회 대상은 전부 영속성 컨텍스트의 관리 대상이다.


엔티티 프로젝션(멤버 조회)

  • SELECT m FROM Member m ...
  • 결과는 멤버가 조회된다.

엔티티 프로젝션(멤버 안에 있는 팀 조회)

  • SELECT m.team FROM Member m ...
  • 결과는 멤버가 아닌 멤버의 팀이 결과로 조회된다.
List<Team> result = 
    em.createQuery("select m.team from Member m", Team.class)
    .getResultList();

// --- 쿼리 튜닝의 편리함을 위해 명시적 Join 형식으로 Join을 하는걸 권장 --- //

List<Team> result =
    em.createQuery("select t from Member m join m.team t", Team.class)
    .getResultList();

임베디드(값 타입) 타입 프로젝션

  • SELECT o.address FROM Order o
  • 엔티티의 값 타입을 조회한다.
  • 임베디드 타입만으로 조회가 안되고 연관된 엔티티를 거쳐서 조회해야 한다.
em.createQuery("select o.address from Order o", Address.class)
    .getResultList();

스칼라 타입 (기본 데이터 타입) 프로젝션

  • hibernate에서 지원을 해서 username, age로 쓸 수 있지만
  • 공식적으로는 m.username, m.age로 접근해야 한다.
  • SELECT m.username, m.age FROM Member m ...
em.createQuery("select distinct m.username, m.age from Member m")
    .getResultList();

여러 값 조회

  • Query 타입, Object[] 타입 조회
List resultList = em
    .createQuery("select distinct m.username, m.age from Member m")
    .getResultList();

// 여러 기본타입들의 타입 캐스팅, Object 배열로 변환
Object o = resultList.get(0);
Object[] result = (Object[]) o;
  • new 명령어 조회
    • 단순 값을 DTO로 바로 조회 한다.
    • new 패키지명, DTO를 넣고 생성자처럼 사용해서 DTO로 바로 반환 받을 수 있다.
      (패키지 명을 포함한 전체 클래스 명 입력 필요)
    • 순서와 타입이 일치하는 DTO 생성자 필요
    • SELECT new org.MemberDTO(m.username, m.age) FROM Member m ...
    • DISTINCT는 중복을 제거 한다.
em.createQuery
("select new org.MemberDTO(m.username, m.age) from Member m", MemberDTO.class)
    .getResultList();
저작자표시 (새창열림)

'📦 Database > JPQL' 카테고리의 다른 글

JQPL 다형성 쿼리 & 결과 조회 API  (0) 2023.04.16
JPQL Named Query & Parameter Binding  (0) 2023.04.16
JPQL Paging API  (0) 2023.04.16
JPQL Type Query & Sub Query  (0) 2023.04.16
JPQL Basic  (0) 2023.04.16
'📦 Database/JPQL' 카테고리의 다른 글
  • JPQL Named Query & Parameter Binding
  • JPQL Paging API
  • JPQL Type Query & Sub Query
  • JPQL Basic
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      GStreamer #Pipeline
      Lock #Thread #Concurrency
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    JPQL Projection
    상단으로

    티스토리툴바