일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Linux
- springSecurity
- sql
- codingtest
- 싱글톤
- springboot
- 2차원배열
- 시큐리티 로그인
- javascript
- 프로그래머스
- Spring boot
- css
- input태그
- JAVA11
- 시큐리티로그인
- StyleSheet
- 시큐리티
- java
- 스프링 부트
- 로그인
- 리눅스
- gradle
- programmers
- 반복문
- html
- 소스트리
- 시큐리티 로그아웃
- 코딩테스트
- security
- 목록
Archives
- Today
- Total
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 참고 링크
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 |