객체 인스턴스는 참조 값으로 식별하고 테이블의 행(row)은 기본 키 값으로 식별한다.
JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다.
예제
// JPQL
select count(m.id) from Member m // 엔티티의 id를 사용
select count(m) from Member m // 엔티티를 직접 사용
// 실행된 SQL (JPQL 둘 다 다임의 같은 SQL을 실행)
select count(m.id) as cnt from Member m
엔티티를 파라미터로 전달
String query = "select m from Member m where m = :member";
Member findMember = em.createQuery(query, Member.class)
.setParameter("member", member1)
.getSingleResult();
System.out.println("member = " + findMember);
// 실행된 SQL
select m.* from Member m where m.id=?
식별자를 직접 전달
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("member = " + findMember);
// 실행된 SQL
select m.* from Member m where m.id=?
이번에는 외래 키를 사용하는 예제이다.
앞으로의 설명을 위해서 필요한 엔티티 정보
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID") //Member가 들고 있는 Team의 왜래 키
private Team team;
...
}
@Entity
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
private String name;
@BatchSize(size = 100)
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
...
}
특정 팀에 소속된 회원을 찾는 경우
외래 키 대신에 엔티티를 직접 사용하는 경우
// Member가 Team에 대한 외래 키를 들고있다.
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("member = " + member);
}
// 실행된 SQL
select m.* from Member m where m.team_id=?
다음과 같이 식별자 값을 직접 사용할 수도 있다.
String query = "select m from Member m where m.team.id = :teamId";
List<Member> members = em.createQuery(query, Member.class)
.setParameter("teamId", teamA.getId())
.getResultList();
for (Member member : members) {
System.out.println("member = " + member);
}
// 실행된 SQL
select m.* from Member m where m.team_id=?
출처
자바 ORM 표준 JPA 프로그래밍 강의
게시글 속 자료는 모두 위 강의 속 자료를 사용했습니다.