본문 바로가기

JPA

2월 17일 JPA JPQL 엔티티 직접 사용

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값이 비교된다.