다형성 쿼리를 날리는 JPQL과 SQL을 비교한다.
*목차
1. IN절 사용
2. TREAT 사용
1. IN절 사용
String query = "select i from Item i where type(i) IN (Book, Album)";
List<Item> items = em.createQuery(query, Item.class).getResultList();
//JPQL
select i from Item i where type(i) in (Book, Album);
//SQL
select i from Item i where i.DTYPE in (Book, Album);
Hibernate:
/* select
i
from
Item i
where
type(i) IN (
Book, Album
) */ select
item0_.id as id2_3_,
item0_.name as name3_3_,
item0_.price as price4_3_,
item0_.artist as artist5_3_,
item0_.ISBN as ISBN6_3_,
item0_.author as author7_3_,
item0_.DTYPE as DTYPE1_3_
from
Item item0_
where
item0_.DTYPE in (
'Book' , 'Album'
)
Album{artist='앨범작가1'}
Album{artist='앨범작가2'}
Book{author='책작가1', ISBN='1234567890'}
싱글 테이블 전략이기 때문에, 자손클래스가 가지고 있지 않은 칼럼들은 모두 null로 입력된다.
2. Treat(JPA 2.1)
상속 구조에서 부모의 타입을 특정 자식 타입으로 다룰 때 사용한다.
FROM, WHERE, SELECT(하이버네이트지원)에서 사용 가능하다.
String query2 = "select i from Item i where treat(i as Book).author = '책작가1'";
List<Item> items2 = em.createQuery(query2, Item.class).getResultList();
//JPQL
select i from Item i where treat(i as Book).author = '책작가1';
//SQL
select i from Item i where i.DTYPE = 'Book' and i.author = '책작가1';
테이블 전략에 따라서 SQL은 바뀔 수 있다. 하지만 JPQL은 어떤 테이블 전략에도 영향받지 않는다. treat으로 자손 클래스를 특정할 수 있을 뿐 아니라 조건도 추가할 수 있다.
Hibernate:
/* select
i
from
Item i
where
treat(i as Book).author = '책작가1' */ select
item0_.id as id2_3_,
item0_.name as name3_3_,
item0_.price as price4_3_,
item0_.artist as artist5_3_,
item0_.ISBN as ISBN6_3_,
item0_.author as author7_3_,
item0_.DTYPE as DTYPE1_3_
from
Item item0_
where
item0_.DTYPE='Book'
and item0_.author='책작가1'
Book{author='책작가1', ISBN='1234567890'}
* 정리
IN절, TREAT를 사용해서 부모 클래스의 특정 자손 클래스를 조회할 수 있다.
반응형
'학습 > DB' 카테고리의 다른 글
JPA를 이용해 페이징 만들기 (0) | 2021.12.15 |
---|---|
JPA를 이용해 자동으로 시간, 작성자 추가하기 (1) | 2021.12.14 |
MERGE INTO(oracle) (0) | 2021.10.07 |
서브쿼리 (0) | 2021.10.06 |
조인 (0) | 2021.10.06 |