본문 바로가기
학습/DB

다형성 쿼리

코동이 2021. 10. 7.

다형성 쿼리를 날리는 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