JPA/JPA 기본

50. 엔티티 직접 사용

sdafdq 2023. 11. 3. 08:11

JPQL에서 엔티티를 직접사용하면 SQL에서는 그 엔티티의 기본 키값을 사용.

 

엔티티 직접 사용한다는 게

select count(m) from Member m

저렇게 m을 직접 사용한다는 거.

 

근데 저런 식으로 하면,

select count(m.id) as cnt from Member m

저렇게 id로 나간다.

즉, function등에 엔티티를 직접 사용하면 id를 사용한다.

 

select count(m.id) from Member m

이것도 같은 sql이 나감

 

 

 

파라미터 넘길때도 마찬가지

Member member = new Member();
member.setUsername("memberA");
em.persist(member);

List<Member> result1 = em.createQuery("select m from Member m where m = :member", Member.class)
        .setParameter("member", member)
        .getResultList();

이렇게 하면,

Hibernate: 
    /* select
        m 
    from
        Member m 
    where
        m = :member */ select
            m1_0.id,
            m1_0.age,
            m1_0.team_id,
            m1_0.type,
            m1_0.username 
        from
            Member m1_0 
        where
            m1_0.id=?

쿼리가 저렇게 where보면 내가 엔티티를 직접 넘겼는데 id로 나감

 

그러니까 member.getId()를 준 거랑 똑같이 쿼리가 나가는 데, 주의할 점이

만약 진짜 파라미터를 id로 넘겨서 찾으려면

List<Member> result1 = em.createQuery("select m from Member m where m.id = :member", Member.class)
        .setParameter("member", member.getId())
        .getResultList();

저렇게 JPQL 비교도 id랑 비교해 줘야함.

 

그러니까 where m = m엔티티를 where m.id = id 로 바꿔주는 거임.

엔티티끼리의 비교를 id끼리의 비교로 바꿔주는 거임.

 

엔티티끼리만 특별히 바꿔주는 거임. 그래서 m.id = 엔티티 하면 그런 식으로 인지를 못함.

 

 

또 엔티티를 직접 사용하는데, 외래키 경우

마찬가지로 외래키를 써서 연결한 것들도 엔티티 일 텐데,

그것들도 마찬가지로 엔티티 끼리는 id로 비교하게 됨.

Team team = new Team();
team.setName("teamA");
em.persist(team);

List<Member> result1 = em.createQuery("select m from Member m where m.team = :team", Member.class)
        .setParameter("team", team)
        .getResultList();

이렇게 하면 나가는 쿼리가

Hibernate: 
    /* select
        m 
    from
        Member m 
    where
        m.team = :team */ select
            m1_0.id,
            m1_0.age,
            m1_0.team_id,
            m1_0.type,
            m1_0.username 
        from
            Member m1_0 
        where
            m1_0.team_id=?

이렇게 where 보면 m.team이었던게 m.team_id 이렇게 나감.

 

파라미터로 넣은 team도 team.getId() 할거임.

 

 

'JPA > JPA 기본' 카테고리의 다른 글

52. JPQL 벌크연산  (0) 2023.11.03
51. Named 쿼리  (0) 2023.11.03
49. 다형성 쿼리  (0) 2023.11.03
48-2. 패치 조인의 한계  (0) 2023.11.02
48. 페치 조인 한계  (0) 2023.11.01