프레임워크(Framework)/JPA

[JPA] JPQL - 다형성 쿼리 - 객체지향 쿼리 언어 JPQL (9)

잇트루 2022. 12. 21. 03:00
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

다형성 쿼리

JPQL로 부모 엔티티를 조회하면 자식 엔티티도 함께 조회한다.

다음과 같이 Item의 자식으로 Book, Album, Movie가 있다고 가정한다. (다형성 쿼리 엔티티)

 

다형성 쿼리 엔티티

Item, Album, Movie, Book

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 단일 테이블 전략 사용
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item { // Item

    @Id @GeneratedValue
    private Long id;

    private String name;

    private int price;

    ...
}

@Entity
@DiscriminatorValue("A")
public class Album extends Item{ // Album

    private String artist;

    ...
}

@Entity
@DiscriminatorValue("M")
public class Movie extends Item { // Movie

    private String director;
    private String actor;

    ...
}

@Entity
@DiscriminatorValue("B")
public class Book extends Item { // Book

    private String author;
    private String isbn;

    ...
}

 

다음과 같이 조회하면 Item 엔티티의 자식도 함께 조회한다.

List resultList = em.createQuery("select i from Item i").getResultList();
  • 단일 테이블 전략(InheritanceType.SINGLE_TABLE)을 사용하여 실제 SQL 쿼리도 동일하게 보낸다.

 

TYPE

TYPE은 엔티티의 상속 구조에서 조회 대상을 특정 자식 타입으로 한정할 때 주로 사용한다.

Item 중에 Book과 Movie를 조회하는 경우

// JPQL
select i from Item i where type(i) IN (Book, Movie)

// 실행된 SQL
SELECT i FROM Item i WHERE i.DTYPE in ('B', 'M')

 

TREAT(JPA 2.1)

  • JPA 2.1에 추가된 기능으로 자바의 타입 캐스팅과 비슷하다.
  • 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용한다.
  • JPA 표준은 FROM, WHERE 절에서만 사용할 수 있다.
  • 하이버네이트는 SELECT 절에서도 사용할 수 있다.

 

부모인 Item과 자식 Book이 있다.

// JPQL
select i from Item i where treat(i as Book).author = 'kim'

// 실행된 SQL
select i.* from Item i where i.DTYPE='B' and i.author='kim'

treat를 사용해서 부모 타입인 Item을 자식 타입인 Book으로 다룰 수 있다.

  • Item을 통해 Book의 author 필드에 접근이 가능
반응형