[JPA] Native Query로 DTO에 매핑하기
이것땜에 진짜 개빡쳐서.. 정리할거임
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를 연결해서 사용한다.
결과적으로 성공은 했지만 위 두 방법을 사용하지는 않았다..^^
내가 사용한 방법은 다음 포스팅에 . ..
Author And Source
이 문제에 관하여([JPA] Native Query로 DTO에 매핑하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jodawooooon/JPA-Native-Query로-DTO에-매핑하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)