📌 JPQL - 다형성 쿼리
- 조회 대상을 특정 자식으로 한정
- 예) Item 중에 Book, Movie를 조회해라
[JPQL]
select i from Item i
where type(i) IN (Book, Movie)
[SQL]
select i from i
where i.DTYPE in (‘B’, ‘M’)
타입이 DTYPE으로 바뀜
- 자바의 타입 캐스팅과 유사
- 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용
- FROM, WHERE, SELECT(하이버네이트 지원) 사용
📌 TREAT(JPA 2.1)
- TREAT 연산자는 JPQL에서 상속 구조를 처리할 때 사용
- 예) 부모인 Item과 자식 Book이 있다.
- 부모 클래스(Item)가 있고, 자식 클래스(Book)가 있는 상황에서
- 자식 클래스에만 있는 추가 속성에 접근하거나 이를 조건으로 사용할 때 유용
[JPQL]
select i from Item i
where treat(i as Book).author = ‘kim’
>> Item 엔티티에서 author가 'kim'인 Book으로 간주될 수 있는 항목을 select
- Item이 부모 클래스이고, Book이 자식 클래스이며, 자식 클래스는 author와 같은 추가적인 속성을 가질 수 있음
- 일반적으로 JPQL 쿼리는 부모 클래스를 기준으로 작성되지만, 특정 자식 클래스에만 존재하는 속성에 접근해야 하는 경우가 있음
- TREAT 함수는 부모 클래스의 인스턴스를 자식 클래스로 간주할 수 있도록 하여, 자식 클래스에만 존재하는 필드에 접근할 수 있도록 해줌
[SQL]
select i.* from Item i
where i.DTYPE = ‘B’ and i.author = ‘kim’
- DB에서는 TREAT 구문이 부모 클래스와 자식 클래스를 구분하는 식별자 열(DTYPE) 또는 유사한 메커니즘을 사용하여 SQL로 변환됨
- 위에서 DTYPE은 실제 자식 클래스(Book)를 식별하는 값을 저장하는 열.
- i.DTYPE = 'B' 조건은 Item 타입 중에서 Book 타입만 필터링하고, 그 다음 author가 'kim'인지 확인함
📌 JPQL - 엔티티 직접 사용
📌 엔티티 직접 사용 - 기본 키 값
- JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용
[JPQL]
select count(m.id) from Member m //엔티티의 아이디를 사용
select count(m) from Member m //엔티티를 직접 사용
- 위에 쿼리는 m.id로 엔티티 아이디를 사용했고
- 아래 쿼리는 m으로 엔티티 자체를 직접 사용했음
[SQL] (JPQL 둘다 같은 다음 SQL 실행)
select count(m.id) as cnt from Member m
- 위 두 JPQL 모두 결과는 위와 같은 SQL문으로 실행됨.
- 엔티티의 아이디를 사용한 것은 당연히 id로 나옴
- 엔티티를 직접 사용한 쿼리 또한 id로 결과가 나옴
- ⇒ JPQL에서 엔티티를 직접 사용하면 해당 엔티티의 기본키 값으로 사용되기 때문!!! 🌟
String jpql = “select m from Member m where m = :member”;
List resultList = em.createQuery(jpql)
.setParameter("member", member)
.getResultList();
>> 엔티티를 파라미터로 전달
String jpql = “select m from Member m where m.id = :memberId”;
List resultList = em.createQuery(jpql)
.setParameter("memberId", memberId)
.getResultList();
>> 식별자를 직접 전달
위 2가지 경우 모두 아래와 같은 SQL문이 실행됨.
⇒ 엔티티를 넘겨도 해당 엔티티의 기본키 값을 사용🌟
select m.* from Member m where m.id=?
외래키도 마찬가지 !!
Team team = em.find(Team.class, 1L);
String qlString = “select m from Member m where m.team = :team”;
List resultList = em.createQuery(qlString)
.setParameter("team", team)
.getResultList();
String qlString = “select m from Member m where m.team.id = :teamId”;
List resultList = em.createQuery(qlString)
.setParameter("teamId", teamId)
.getResultList();
[실행된 SQL문]
select m.* from Member m where m.team_id=?
반응형