JPQL과 left join

띠로리·2024년 8월 12일

left (outer) join

스프링 부트 2버전 이후에 포함되는 JPA 버전은 엔티티 클래스 내에 전혀 연관관계가 없더라도 조인을 이용할 수 있다. 조인을 할 때 INNER JOIN 혹은 JOIN과 같이 일반적인 조인을 이용할 수도 있고, LEFT OUTER JOIN, LEFT JOIN을 이용할 수도 있다.

엔티티 클래스 내부에 연관관계가 있는 경우

Board 엔티티 클래스의 내부에는 Member 엔티티 클래스를 변수로 선언하고, 연관관계를 맺고 있다. 이러한 경우에는 Board의 writer 변수를 이용해 조인을 처리한다.

package org.zerock.board.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.zerock.board.entity.Board;

import java.util.List;

public interface BoardRepository extends JpaRepository<Board, Long> {
    // 한 개의 로우(Object) 내에 Object[ ] 로 나옴
    @Query("select b, w from Board b left join b.writer w where b.bno =:bno")
    Object getBoardWithWriter(@Param("bno") Long bno);
}
  • 내부에 있는 엔티티를 이용할 때는 LEFT JOIN 뒤에 ON을 이용하는 부분이 없다.

연관관계가 없는 엔티티 조인 처리에는 on

Board와 Reply는 Reply 쪽이 @ManyToOne으로 참조하고 있으나 Board 입장에서는 Reply 객체들을 참조하고 있지 않기 때문에 문제가 된다. 이런 경우에는 직접 조인에 필요한 조걸을 on을 이용해서 작성해야 한다.

package org.zerock.board.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.zerock.board.entity.Board;

import java.util.List;

public interface BoardRepository extends JpaRepository<Board, Long> {
	...

    @Query("select b, r from Board b left join Reply r on r.board=b where b.bno=:bno")
    List<Object[]> getBoardWithReply(@Param("bno") Long bno);
}
profile
차곡 차곡 기록 쌓기

0개의 댓글