프레임워크(Framework)/JPA

[JPA] JPQL 엔티티 직접 사용 - 객체지향 쿼리 언어 JPQL (10)

잇트루 2022. 12. 22. 23:37
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

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

  • 객체 인스턴스는 참조 값으로 식별하고 테이블의 행(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을 실행한다.
반응형