[JPA] Native Query로 DTO에 매핑하기

6860 단어 TILJPASpringbootJPA

이것땜에 진짜 개빡쳐서.. 정리할거임

Native Query로 테이블 조인 후 DTO로 반환하기


서로 다른 두 테이블을 Join해서 특정 컬럼만 뽑아낸 뒤 Entity가 아닌 특정 DTO로 결과를 반환하려고 한다.

위를 구현하기 위한 방법은 여러가지가 있다.
그래서 다 시도 해 봤다..


1. Object[]로 리턴하기

  • Repository
    @Query(
           value = "SELECT b.id, b.user_id, b.board_type, b.title, b. .... "
           .
           .
           .
                    + "ORDER BY b.reg_date DESC "

            nativeQuery = true
    )
    Page<Object[]> findBoardList(Pageable pageable, int type1, int type2);

Object[]형태로 값을 반환한 뒤 해당 값을 직접 DTO 데이터 타입에 맞게 매핑해 줘야한다.
Object로 값이 잘 나오는 건 확인했지만, 이건 아닌 것 같아서 패스했다.

2. ResultSetMapping

  • Entity
    특정 Entity에서 @SqlResutSetMapping@NamedNativeQuery를 이용하여 result를 직접 매핑해준다.
    이 때 ConstructorResult를 사용하기 때문에 리턴할 DTO에 생성자를 만들어야 한다.
@Entity
@SqlResultSetMapping(
        name="BoardandDogMapping",
        classes = @ConstructorResult(
                targetClass = BoardListData.class,
                columns = {
                        @ColumnResult(name="id", type = Long.class),
                       .
                       .
                       .
                       
                        @ColumnResult(name="weight", type = Long.class),
                })
)
@NamedNativeQuery(
        name="BoardAndDogwithPaging",
        query="SELECT b.id, b.user_id, b.board_type, b.title, b.thumbnail_url, b.reg_date, d.gender, d.dog_name, d.mbti, d.age_type, d.color_type, d.dog_type, d.weight "
              .
              .
              .
              
        +"LIMIT :limit OFFSET :offset",
        resultSetMapping="BoardandDogMapping")
@Table(name="board", schema = "board")
@Getter
.
.
.

위와 같이 ResultSetMapping을 위해서는 DTO와 매핑될 컬럼의 정보를 선언해 주면 원하는 DTO로 값을 리턴할 수 있다.

  • Repository
    @Query(name = "BoardAndDogwithPaging", nativeQuery = true)
    List<BoardListData> findBoardListwithPaging(
           ..  
    );

그리고 Repository에서 @Query에 namedQuery를 연결해서 사용한다.

결과적으로 성공은 했지만 위 두 방법을 사용하지는 않았다..^^
내가 사용한 방법은 다음 포스팅에 . ..

좋은 웹페이지 즐겨찾기