이것땜에 진짜 개빡쳐서.. 정리할거임
Native Query로 테이블 조인 후 DTO로 반환하기
서로 다른 두 테이블을 Join해서 특정 컬럼만 뽑아낸 뒤 Entity가 아닌 특정 DTO로 결과를 반환하려고 한다.
위를 구현하기 위한 방법은 여러가지가 있다.
그래서 다 시도 해 봤다..
@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로 값이 잘 나오는 건 확인했지만, 이건 아닌 것 같아서 패스했다.
@SqlResutSetMapping
과 @NamedNativeQuery
를 이용하여 result를 직접 매핑해준다.@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로 값을 리턴할 수 있다.
@Query(name = "BoardAndDogwithPaging", nativeQuery = true)
List<BoardListData> findBoardListwithPaging(
..
);
그리고 Repository에서 @Query에 namedQuery를 연결해서 사용한다.
결과적으로 성공은 했지만 위 두 방법을 사용하지는 않았다..^^
내가 사용한 방법은 다음 포스팅에 . ..
잘 봤습니다.
다음화 어딨나요? 흑