JAVAIARY

N:1(다대일) 연관 관계 2 - JPQL과 LEFT(OUTER) JOIN 본문

Project/2023.02~ ) Study toy 프로젝트

N:1(다대일) 연관 관계 2 - JPQL과 LEFT(OUTER) JOIN

shiherlis 2023. 3. 5. 22:02

목록화면에서 게시글의 정보 + 댓글 수를 가져오기 위해 여러 엔티티가 필요하기 때문에 Join을 사용함

JOIN 참고 링크

https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

 

SQL 기본 문법: JOIN(INNER, OUTER, CROSS, SELF JOIN)

조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.OUTER JOIN(외부

hongong.hanbit.co.kr


1.목록화면에 필요한 JPQL  구성하기

  • 목록화면에서 필요한 데이터
    • 게시물(Board): 게시물의 번호, 제목, 게시물의 작성 시간
    • 회원(Member): 회원의 이름/이메일
    • 댓글(Reply): 해당 게시물의 댓글 수

가장 많은 데이터를 가져오는 쪽은 Board이므로 Board를 중심으로 조인 관계 작성

@Query(value ="SELECT b, w, count(r) " +
        " FROM Board b " +
        " LEFT JOIN b.writer w " +
        " LEFT JOIN Reply r ON r.board = b " +
        " GROUP BY w, b",
        countQuery ="SELECT count(*) FROM Board b")
Page<Object[]> getBoardWithReplyCount(Pageable pageable);
  • Member는 Reply와 연관관계가 없으므로 Board와 조인 후 "Group by"처리를 통해
    하나의 게시물 당 하나의 라인이 될 수 있도록 처리
  • 책에서는 group by b 만 작성해 주어도 정상 실행이 되는 걸로 나왔지만,
    DB차이인지 writer 도 함께 그룹으로 묶어주어야 정상 실행이 되었다.
  • 오류 해결은 했지만 원인을 찾지 못해 찜찜...
@Test
public void testWithReplyCount(){
    Pageable pageable = PageRequest.of(0,10, Sort.by("bno").descending());
    Page<Object[]>  result = boardRepository.getBoardWithReplyCount(pageable);
    result.get().forEach(row -> {
        Object[] arr = (Object[])row;
        System.out.println(Arrays.toString(arr));
    });}

2. 조회화면에서 필요한 JPQL 구성하기

@Query(value ="SELECT b, w, count(r) " +
        " FROM Board b LEFT JOIN b.writer w " +
        " LEFT OUTER JOIN Reply r ON r.board = b " +
        " Where b.bno = :bno"+
        " Group By b, w")
Object getBoardByBno(@Param("bno") Long bno);
@Test
public void testRead3(){
    Object result = boardRepository.getBoardByBno(100L);
    Object[] arr = (Object[])result;
    System.out.println(Arrays.toString(arr));
}
 

'Project > 2023.02~ ) Study toy 프로젝트' 카테고리의 다른 글

컨트롤러와 화면 처리  (0) 2023.03.06
프로젝트 적용하기(Board)  (0) 2023.03.06
N:1(다대일) 연관관계 1  (0) 2023.03.01
검색 처리  (0) 2023.02.27
Spring Boot) 게시글 수정/ 삭제 처리  (0) 2023.02.21