은세고화
뚜렷한 기억보단 흐릿한 잉크를
은세고화
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • TDD (2)
      • 학점 산출 프로그램 (2)
    • IT (43)
      • 부스트코스 (18)
      • CS50 (3)
      • 도서추천 알고리즘 (2)
      • 스터디 일정 (3)
      • 스프링 (3)
      • 프로젝트 개발 중 발생한 에러 (8)
      • 웹개발 (3)
      • DB (3)
    • 독서 후기 (12)
      • 도서 (12)
    • e북 (3)
    • 알고리즘 (26)
    • 프로젝트 (6)
      • 향수 (6)
    • 회고 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
은세고화

뚜렷한 기억보단 흐릿한 잉크를

프로젝트/향수

No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type

2021. 9. 2. 14:49
반응형

상황


스프링 부트와 JPA를 사용 중 @Query문을 작성한 뒤 실행했는데 에러가 발생했다.

JPA를 잘 알지 못해서 3일정도 걸렸다...ㅠ

 

Entity: user id , perfumeName, image, email

dto: perfumeName, countUserId, image 이런 식으로 엔티티를 조금 변형한 형식으로 받아야 했다.

DTO:

private String perfumeName;
private String image;
private int countPerfumeName;

public PerfumeListResponseDto(FavoritePerfume entity, int countPerfumeName){
this.perfumeName = entity.getPerfumeName();
this.image = entity.getImage();
this.countPerfumeName = countPerfumeName;
}

 

@Query("select p.perfumeName , count(p.userId) , p.image  from FavoritePerfume p group by p.perfumeName order by count(p.userId) desc") 

List<PerfumeListResponseDto> findAllDesc();

 

작성한 쿼리문이다

 

시도해본 방법


시도하면서 든 의문은 대체 count를 조회해서 어떻게 담아야 하는가? 였다.

위의 Dto는 막연히 책을 따라해서 만든 방식이어서 조회 순서대로 변경을 해봤다.

Before

public PerfumeListResponseDto(FavoritePerfume entity, int countPerfumeName){
this.perfumeName = entity.getPerfumeName();
this.image = entity.getImage();
this.countPerfumeName = countPerfumeName;
}

After

public PerfumeListResponseDto(String perfumeName, Long countPerfumeName, String image){
this.perfumeName = entity.getPerfumeName();
this.image = entity.getImage();
this.countPerfumeName = countPerfumeName;
}

 

에러는 계속 발생했고 Interface를 활용한 projection방식을 도입하라는 글을 봐서 해봤다.

이 방식은 Dto파일을 삭제하고 interface로 받아야 할것들만 getPerfumeName 이런 식으로 선언 해 놓는 방식이다.

 

public interface PerfumeListResponseInterface {
String getPerfumeName();
Long getCountPerfumeName();
String getImage();
}

 

repo도 수정해야한다.

@Query("select p.perfumeName , count(p.userId) , p.image  from FavoritePerfume p group by p.perfumeName order by count(p.userId) desc") 

List <PerfumeListResponseInterface>findAllDesc();

 

마찬가지로 에러가 발생했다. 

 

 

해결


count를 해놓고 같은 타입으로 선언해놓으면 자동으로 매핑되는 줄 알았는데 아니었다. AS로 이름을 지정해줘야 한다.

쿼리문을 수정한다.

@Query("select p.perfumeName AS perfumeName, count(p.userId) AS countPerfumeName, p.image AS image from FavoritePerfume p group by p.perfumeName order by count(p.userId) desc")

 

저기서 p.perfumeName도 AS로 선언해야 매핑된다.

 

간단한 방식이었지만 긴 시간 소비했다. 참고로 쿼리문을 수정하더라도 Dto를 사용하면 에러가 발생한다. 

즉 기존 코드에서 -> projection으로 인터페이스로 변환 -> AS로 이름 매핑 이 방식으로 해결했다.

반응형
저작자표시 (새창열림)

'프로젝트 > 향수' 카테고리의 다른 글

JPA외래키 설정시 데이터 입력 방향  (0) 2022.02.16
데이터베이스 설계문제  (0) 2021.11.22
no httpMessageConverter for  (1) 2021.08.25
should have [public, protected] no-arg constructor  (0) 2021.08.24
java.net.UnknownHostException  (1) 2021.08.18
    '프로젝트/향수' 카테고리의 다른 글
    • JPA외래키 설정시 데이터 입력 방향
    • 데이터베이스 설계문제
    • no httpMessageConverter for
    • should have [public, protected] no-arg constructor
    은세고화
    은세고화

    티스토리툴바