BoardSearchImpl ( join 처리 ) > SPRING_DATA_JPA

본문 바로가기
사이트 내 전체검색

SPRING_DATA_JPA

BoardSearchImpl ( join 처리 )

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 340회 작성일 24-06-21 11:15

본문

package web.repository;


import java.util.List;


import org.springframework.data.domain.Page;

import org.springframework.data.domain.PageImpl;

import org.springframework.data.domain.Pageable;

import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;


import com.querydsl.core.BooleanBuilder;

import com.querydsl.jpa.JPQLQuery;


import web.domain.Board;

import web.domain.QBoard;

import web.domain.QReply;

import web.dto.BoardListReplyCountDTO;


public class BoardSearchImpl extends QuerydslRepositorySupport implements BoardSearch{


public BoardSearchImpl() {

super(Board.class);

}


@Override

public Page<Board> searchAll(String[] types, String keyword, Pageable pageable) {

QBoard board = QBoard.board; //Q도메인 객체 선언 및 초기화

JPQLQuery<Board> query = from(board); //select ... from board (쿼리 부분)


//검색 타입과 검색어가 있다면

if( (types != null && types.length > 0) && keyword != null ) {

BooleanBuilder booleanBuilder = new BooleanBuilder();


for(String type : types) {

switch (type){

case "t":

booleanBuilder.or(board.title.contains(keyword));

break;

case "c":

booleanBuilder.or(board.content.contains(keyword));

break;

case "w":

booleanBuilder.or(board.writer.contains(keyword));

break;

} //switch

} //for


query.where(booleanBuilder);

} //if


query.where(board.bno.gt(0L));


//paging

this.getQuerydsl().applyPagination(pageable, query);


List<Board> list = query.fetch();

long count = query.fetchCount();


return new PageImpl<>(list, pageable, count);

}


@Override

public Page<Board> search1(Pageable pageable) {

QBoard board = QBoard.board; //Q도메인 객체 선언 및 초기화


JPQLQuery<Board> query = from(board); //select ... from board (쿼리 부분)

query.where(board.title.contains("1")); //where title like '%1%' (쿼리 부분)


//paging

this.getQuerydsl().applyPagination(pageable, query);


List<Board> list = query.fetch();

long count = query.fetchCount();


return null;

}


@Override

public Page<BoardListReplyCountDTO> searchWithReplyCount(String[] types, String keyword, Pageable pageable) {

QBoard board = QBoard.board;

QReply reply = QReply.reply;


JPQLQuery<Board> query = from(board);

query.leftJoin(reply).on(reply.board.eq(board));


query.groupBy(board);


return null;

}


}






[설명]
BoardSearchImpl에서 searchWithReplyCount()구현에는 단방향 참조가 가지는 단점이 보이는데 그것은 바로 필요한 정보가 하나의 엔티티를 통해서 접근할 수 없다는 점이다.
해결하기 위해서는 JPQL을 이용해서 'left join' 이나 'inner join'과 같은 조인(join)을 이용하는 것이다.
JPQLQuery의 leftJoin()을 이용할 때는 on()을 이용해서 조인 조건을 지정한다. 
조인 처리 후에 게시물당 처리가 필요하므로 groupBy()를 적용한다.

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

공지사항
자유게시판
질문답변
1:1문의

 

별명 : 터푸가위
주소 : 부산시 동래구 명장로20번길 90
대표 : 박규태
메일 : dancepkt@******.com

접속자집계

오늘
160
어제
118
최대
10,760
전체
276,987
Copyright © dancePKT . All rights reserved.