본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JPA

JPQL - JPQL 의 여러가지 기능들(1)

by 방구석 대학생 2020. 11. 29.

"인프런 - 자바 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