상황
스프링 부트와 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 (0) | 2021.08.25 |
should have [public, protected] no-arg constructor (0) | 2021.08.24 |
java.net.UnknownHostException (0) | 2021.08.18 |