JPQL 엔티티 직접 사용
엔티티 직접사용 - 기본키 값
-JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본키 값을 사용
(JPQL)
select count(m.id) from Member m ; //엔티티의 아이디(m.id)를 사용
select count(m) from Member m ; // 엔티티를 직접사용
(SQL) //적용한 JPQL은 위와 같다. 위 두 JPQL 모두 아래와 같이 해석된다.
select count(m.id) as cnt from Member m;
(중요)JPQL에서 엔티티를 별도 컬럼없이 바로 사용하면 기본적으로 id(pk)값을 사용하는것으로 인식한다.
select 절에서만 해당된다.
단 id를 비교(where)할땐 id 필드값으로 , 엔티티는 엔티티로 비교해야한다.
이는 값을 파라미터로 넘겨도 같은데
엔티티를 파라미터로 전달
Member member = em.find(Member.class, member.getId);
String jpql = "select m from Member m where m=:member"; // 엔티티 m은 엔티티 member로 비교
List resultList = em.createQuery(jpql)
.setParameter('member' , member)
.getResultList();
식별자를 직접 전달
Long memberId = member.getId();
String jpql = "select m from Member m where m.id = :memberId" // 값 m.id 는 memberId로 비교
List resultList = em.createQuery(jpql)
.setParameter('memberId' , memberId)
.getResultList();
실행된 SQL
select m.* from Member m where m.id = ?
그럼에도 jpql에서 엔티티가 넘어오게 되면 기본적으로 id(pk)로 넘어온다.
엔티티 직접사용 - 외래키 값
Team team = em.find(Team.class , 1L)
String sqlString = "select m from Member m where m.team = :team "
List resultList = em.createQuery(sqlString)
.setParameter('team' , team)
.getResultList();
Long teamId = team.getId();
String sqlString = "select m from Member m where m.team_id = :teamId"
List resultList = em.createQuery(sqlString)
.setParameter('team_id' , teamId)
.getResultList();
실행된 SQL
select m.* from Member m where m.team_id = ?;
m.team은 엔티티형 필드여서 엔티티 이다.
즉 m.team은 m.team_id 와 같고 team과 비교하면 pk값이 비교된다.
'JPA' 카테고리의 다른 글
| 2월 20일 JPA JPQL- 벌크연산 (0) | 2023.02.20 |
|---|---|
| 2월 20일 JPQL - named쿼리 (정적쿼리) (0) | 2023.02.20 |
| 2월 17일 JPA JPQL 다형성 쿼리 (0) | 2023.02.17 |
| 2월 16일 JPA JPQL 페치조인의 특징과 한계 (0) | 2023.02.16 |
| 2월 16일 JPA 일대다 관계, 컬렉션 페치 조인 (0) | 2023.02.16 |