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 |