관리 메뉴

bright jazz music

[bootBoard] N:1(다대일) 연관관계: 7-2. JPQL과 left(outer) join 연관관계 X 본문

Framework/Spring

[bootBoard] N:1(다대일) 연관관계: 7-2. JPQL과 left(outer) join 연관관계 X

bright jazz music 2022. 9. 28. 21:39

연관관계가 없는 엔티티 조인 처리에는 'ON'을 사용해 줘야 한다.

Board와 Member 사이에는 내부적으로 참조를 통해서 연관관계가 있었다.

//Board.java

...

@ManyToOne(fetch = FetchType.LAZY) //명시적으로 Lazy Loading 지정
private Member writer; //FK 연관관계 지정


//Reply.java

...

@ManyToOne
private Board board;

Board와 Reply는 이러한 관계가 아니다. 

 

//Reply.java
...

@ManyToOne
private Board board;

Reply 쪽이@ManyToOne으로 참조하고 Board를 참조하고 있지만 Board에서는 Reply 객체를 참조하고 있지 않다. 이러한 경우에는 "ON'을 이용해서 직접 조인을 작성해 줘야 한다. 순수 SQL로 작성하자면 아래와 같다.

select
	board.bno, board.title, board.writer_email, rno, text
from board left outer join reply
on reply.board_bno = board.bno
where board.bno = 100;

 

BoardRepository.java에 JPQL을 사용하여 작성하면 아래와 같다.

//BoardRepository.java

...

//ON을 사용하여 Reply와 조인
@Query("SELECT b, r FROM Board b LEFT OUTER JOIN Reply r ON r.board = b WHERE b.bno = :bno")
List<Object[]> getBoardWithReply(@Param("bno") Long bno);

 

BoardRepositoryTests.java에 테스트

//BoardRepositoryTests.java

...

@Test
public void testGetBoardWithReply(){
    List<Object[]> result = boardRepository.getBoardWithReply(100L);

    for (Object[] arr : result) {
        System.out.println(Arrays.toString(arr));
    }
}

 

결과

ON을 사용해서 조인하는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments