"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."
www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그
www.inflearn.com
JPQL 다형성 쿼리
우선 객체 모델을 다음과 같이 다형적으로 설계했다고 가정하자.
이럴 경우 JPA 가 특수한 기능들을 제공한다.
TYPE
- 조회 대상을 특정 자식으로 한정 지을 수 있다.
예시 : 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')
TREAT (JPA 2.1)
- 자바의 타입 캐스팅과 유사한 기능이며, 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용한다.
- FROM, WHERE, SELECT (Hibernate 지원) 에서 사용한다.
예시 : 부모인 Item 과 자식 Book 이 있다.
JPQL : select i from Item i where treat(i as Book).auther = 'kim'
SQL : select i.* from Item i where i.DTYPE = 'B' and i.auther = 'kim'
Entity 의 직접 사용
- 기본 키 값을 활용하는 경우
JPQL 에서 Entity 를 직접 사용하면 SQL 에서 해당 Entity 의 기본 키 값을 사용한다.
JPQL : select count(m.id) from Member m // Entity 의 아이디를 사용하는 경우
select count(m) from Member m // Entity 를 직접 사용하는 경우
SQL : (위의 JPQL 두 가지 다 똑같이 아래의 SQL 을 실행시킨다.)
select count(m.id) as cnt from Member m
보통 SQL 에서는 함수 안에 함수를 쓰든, 파라미터를 넘기든, 데이터나 데이터의 식별자 값을 넘기지 Entity 자체를 넘기지는 않는다.
그런데 JPQL 은 Entity 를 쓸 수 있기 때문에 가능하다.
(Entity 를 식별할 수 있는 것은 기본 키 값이기 때문에 어쩌면 당연한 얘기이다.)
Entity 를 파라미터로 전달해도 동일하게 기본 키 값을 사용한다.
아래의 코드를 한번 살펴보자.(Entity 를 파라미터로 전달하는 경우)
- JpaMain.java
// JPQL Entity 직접 사용 - 파라미터 전달
String query = "select m from Member m where m = :member";
Member findMember = em.createQuery(query, Member.class)
.setParameter("member", member1)
.getSingleResult();
System.out.println("findMember = " + findMember);
- Hibernate SQL
Hibernate:
/* select
m
from
Member m
where
m = :member */ select
member0_.id as id1_0_,
member0_.age as age2_0_,
member0_.TEAM_ID as team_id5_0_,
member0_.type as type3_0_,
member0_.username as username4_0_
from
Member member0_
where
member0_.id=? /* Entity 를 파라미터로 전달했을때 SQL 에서는 기본 키 값으로 식별자를 전달했다.*/
findMember = Member{id=3, username='회원1', age=0}
(식별자를 직접 전달하는 경우)
- JpaMain.java
String query = "select m from Member m where m.id = :memberId";
Member findMember = em.createQuery(query, Member.class)
.setParameter("memberId", member1.getId())
.getSingleResult();
System.out.println("findMember = " + findMember);
- Hibernate SQL
Hibernate:
/* select
m
from
Member m
where
m.id = :memberId */ select
member0_.id as id1_0_,
member0_.age as age2_0_,
member0_.TEAM_ID as team_id5_0_,
member0_.type as type3_0_,
member0_.username as username4_0_
from
Member member0_
where
member0_.id=? /*Entity 를 파라미터로 전달했을 때와 마찬가지로 SQL 에서 기본 키 값으로 식별자를 전달했다. */
findMember = Member{id=3, username='회원1', age=0}
Entity 를 외래 키 값을 통해 전달하는 경우
Member 와 연관된 Team 에서 Team 의 외래 키 값을 통해 Member 의 기본 키 값을 찾아 전달하는 경우이다.
- JpaMain.java
// JPQL Entity 직접 사용 - 외래 키 전달
String query = "select m from Member m where m.team = :team";
List<Member> members = em.createQuery(query, Member.class)
.setParameter("team", teamA)
.getResultList();
for (Member member : members) {
System.out.println("findMember = " + members);
}
- Hibernate SQL
Hibernate:
/* select
m
from
Member m
where
m.team = :team */ select
member0_.id as id1_0_,
member0_.age as age2_0_,
member0_.TEAM_ID as team_id5_0_,
member0_.type as type3_0_,
member0_.username as username4_0_
from
Member member0_
where
member0_.TEAM_ID=?
findMember = [Member{id=3, username='회원1', age=0}, Member{id=4, username='회원2', age=0}]
findMember = [Member{id=3, username='회원1', age=0}, Member{id=4, username='회원2', age=0}]
'JPA' 카테고리의 다른 글
JPQL - JPQL 의 여러가지 기능들(2) (0) | 2020.11.29 |
---|---|
JPQL - JPQL 페치 조인(4) (0) | 2020.11.28 |
JPQL - JPQL 페치 조인(3) (0) | 2020.11.28 |
JPQL - JPQL 페치 조인(2) (0) | 2020.11.28 |
JPQL - JPQL 페치 조인(1) (0) | 2020.11.28 |