반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
엔티티 직접 사용 - 기본 키 값
- 객체 인스턴스는 참조 값으로 식별하고 테이블의 행(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
- 두 번째 JPQL의 count(m)은 엔티티의 별칭을 직접 넘겨준다.
- 엔티티를 직접 사용하면, JPQL이 SQL로 변환될 때 해당 엔티티의 기본 키를 사용한다.
- 따라서 실제 실행된 SQL은 둘 다 같다.
엔티티를 파라미터로 전달
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=?
- where m = :member로 엔티티를 직접 사용하는 부분이 SQL에서 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=?
- 엔티티를 파라미터로 전달하는 경우와 식별자를 직접 전달하는 경우에도 같은 SQL을 실행한다.
엔티티 직접 사용 - 외래 키 값
이번에는 외래 키를 사용하는 예제이다.
@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")
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<>();
...
}
특정 팀에 소속된 회원을 찾는 경우
외래 키 대신에 엔티티를 직접 사용하는 경우
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=?
- 팀 엔티티를 파라미터로 사용하는 경우이다
- m.team은 team_id라는 외래 키와 매핑되어 있기 때문에 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=?
- m.team.id로 식별자 값을 직접 사용하는 경우이다.
- Member와 Team 간에 묵시적 조인이 일어날 것 같으나 MEMBER 테이블이 team_id 외래 키를 가지고 있어 묵시적 조인이 일어나지 않는다.
- m.team.name 등을 호출하면 묵시적 조인이 일어난다.
- 따라서 팀 엔티티를 파라미터로 사용하는 경우와 같은 SQL을 실행한다.
반응형
'프레임워크(Framework) > JPA' 카테고리의 다른 글
[JPA] JPQL 벌크 연산 - 객체지향 쿼리 언어 JPQL (12) (0) | 2022.12.24 |
---|---|
[JPA] JPQL Named 쿼리(정적 쿼리) - 객체지향 쿼리 언어 JPQL (11) (0) | 2022.12.23 |
[JPA] JPQL - 다형성 쿼리 - 객체지향 쿼리 언어 JPQL (9) (0) | 2022.12.21 |
[JPA] JPQL 페치 조인(Fetch join) - 객체지향 쿼리 언어 JPQL (8) (0) | 2022.12.20 |
[JPA] JPQL 경로 표현식 - 객체지향 쿼리 언어 JPQL (7) (0) | 2022.12.19 |