반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 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 필드에 접근이 가능
반응형
'프레임워크(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 |