twocowsong

연관관계 조회 본문

IT/JPA

연관관계 조회

WsCode 2022. 5. 31. 23:52

 

연관관계가 있는 엔티티를 조회하는 방법은 크게 2가지입니다.

- 객체 그래프 탐색(객체 연관관계를 사용한 조회)

- 객체지향 쿼리 사용(JPQL)

 

방금 저장한 대로 회원1, 회원2가 팀1에 소속되어있습니다.

 

객체 그래프 탐색

member.getTeam()을 사용해서 member와 연관된 team엔티티를 조회할 수 있습니다.

Member member = em.find(Member.class, "member1");
// 객체 그래프 탐색
Team team = member.getTeam();
System.out.println("팀 이름 : " + team.getName());

// 출력 결과 : 팀 이름 : 팀1

위처럼 객체를 통해 연관된 엔티티를 조회하는것을 객체 그래프 탐색이라고 합니다.

 

- 객체지향 쿼리 사용

객체지향 쿼리인 JPQL에서 연관관계를 어떻게 사용하는지 확인해보겠습니다.

회원을 대상으로 조회하는데 팀1에 소속된 회원만 조회하려면 회원과 연관된 팀 엔티티를 검색조건으로 사용해야 합니다.

SQL은 연관된 테이블을 조인해서 검색조건을 사용하면됩니다.

JPQL도 조인을 지원하지만 문법이 약간다릅니다.

 

public static void main(String[] args) {
   EntityManagerFactory emf =
         Persistence.createEntityManagerFactory("jpa-study");

   EntityManager em = emf.createEntityManager();
   EntityTransaction tx = em.getTransaction();

   try {
      tx.begin();

      queryLogicJoin(em);

      tx.commit();
   }
   catch (Exception e) {
      tx.rollback();
   }

}

public static void queryLogicJoin(EntityManager em) {
   String jqpl = "select m from Member m join m.team t where " +
         "t.name=:teamName";

   List<Member> resultList = em.createQuery(jqpl, Member.class)
         .setParameter("teamName", "팀1")
         .getResultList();

   resultList.forEach(obj -> {
      System.out.println("[query] member.username = " + obj.getUsername());
   });
}

queryLogicJoin 결과는 아래와 같습니다.

[query] member.username = 회원1
[query] member.username = 회원2

 

JPQL의 from 부분을 보면 회원이 팀과 관계를 가지고 있는 필드를 통해서 Member와 Team을 조인했습니다.

from Member m join m.team t

 

 

where절을 보면 조인한 t.name을 검색조건으로 사용해서 팀1에 속한 회원만 검색하였습니다.

:teanName과 같이 :로 시작하는 것은 파라미터를 바인딩으로 받는 문법입니다.

where t.name=:teamName

 

완성된 JPQL은 안래와 같습니다.

select m from Member m join m.team t where t.name=:teamName

이때 실행되는 SQL은 다음과 같습니다.

SELECT M.MEMBER_ID,
       M.USERNAME,
       M.TEAM_ID
  FROM MEMBER M
 INNER JOIN TEAM T
    ON M.TEAM_ID = T.TEAM_ID
 WHERE T.NAME = '팀1'

 

실행된 SQL과 JQPL을 비교하면 JPQL은 객체를 대상으로 하고 SQL보다 간결합니다.

'IT > JPA' 카테고리의 다른 글

연관관계 제거  (0) 2022.06.01
연관관계 수정  (0) 2022.06.01
연관관계 사용  (0) 2022.05.29
@ManyToOne  (0) 2022.05.28
@JoinColumn  (0) 2022.05.28