반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
다형성 쿼리
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 필드에 접근이 가능
반응형
'프레임워크(Framework) > JPA' 카테고리의 다른 글
[JPA] JPQL Named 쿼리(정적 쿼리) - 객체지향 쿼리 언어 JPQL (11) (0) | 2022.12.23 |
---|---|
[JPA] JPQL 엔티티 직접 사용 - 객체지향 쿼리 언어 JPQL (10) (0) | 2022.12.22 |
[JPA] JPQL 페치 조인(Fetch join) - 객체지향 쿼리 언어 JPQL (8) (0) | 2022.12.20 |
[JPA] JPQL 경로 표현식 - 객체지향 쿼리 언어 JPQL (7) (0) | 2022.12.19 |
[JPA] JPQL 타입 표현과 기타식, 조건식 - 객체지향 쿼리 언어 JPQL (6) (0) | 2022.12.18 |