Project/Management

[Management] Spring Data JPA : nativeQuery의 결과를 DTO에 직접 매핑

lakelight 2022. 11. 11. 11:38
728x90
반응형

 

Error
No converter found capable of converting from type [org.springframework.data.jpa.repository.query

 

1. 문제 인식

원자재 아이템 항목의 전체 재고를 한번에 조회하기 위한 쿼리를 만들었습니다.
Spring Data Jpa 를 사용하기 때문에 @Query를 이용해서 작성했습니다.

    @Query(value = 
            "SELECT item.name AS itemName, SUM(material.count) AS sumCount, MAX(material.created_date) AS recentCreatedDate " +
            "FROM material JOIN item ON item.id = material.item WHERE material.item_type='RAW' GROUP BY item.name;", nativeQuery = true)
    List<ProductDto.TotalMaterialResponseDto> totalRawMaterial();
제가 작성한 Query는 다음과 같고, Query의 결과를 처리하기 위해 DTO를 만들어서 반환하려고 했습니다.

 

@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public static class TotalMaterialResponseDto {

    private String itemName;
    private Integer sumCount;
    private String recentCreatedDate;
    }
}
DTO는 다음과 같이 만들어서 Query 결과에서 Alias와 일치하는 값으로 하여 매핑되도록 하였습니다.

 

* 오류 발생 *
No converter found capable of converting from type [org.springframework.data.jpa.repository.query]

 

2. 문제 해결

알고 보니 결과 필드에 대한 Getter 가 있는 Interface를 만들어서 프로젝션하면 바로 결과를 받을 수 있었습니다.

public static interface TotalMaterialResponseDto {

    String getItemName();
    Integer getSumCount();
    LocalDateTime getRecentCreatedDate();
}
그래서 DTO 부분을 위와 같이 만들어서 Alias와 일치하는 값의 getter를 선언해주어 문제를 해결할 수 있었습니다.

 

마무리

nativeQuery의 결과를 Dto에 매핑하는 유일한 솔루션은 getter Interface를 만드는 것입니다.

오늘도 몰랐던 지식을 쌓을 수 있는 하루가 되었습니다.

포스팅 읽어주셔서 감사합니다.

 

[참고]

1. Spring JPA :: No converter found capable of converting from type

728x90
반응형