✏️ [JPQL] 엔티티 직접 사용

박상민·2023년 10월 30일
0

JPA

목록 보기
19/24
post-thumbnail

⭐️ 엔티티 직접 사용 - 기본 키 값

객체 인스턴스는 참조 값으로 식별하고 테이블의 행(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") //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=?
  • 팀 엔티티를 파라미터로 사용하는 경우이다
  • 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을 실행한다.

출처
자바 ORM 표준 JPA 프로그래밍 강의
게시글 속 자료는 모두 위 강의 속 자료를 사용했습니다.

profile
스프링 백엔드를 공부중인 대학생입니다!

0개의 댓글