MelRanG
719
2021-09-01 22:44:55 작성 2021-09-01 23:07:13 수정됨
2
154

jpa에서 count질문입니다.


JPA에서 조회 쿼리를 만들고 받을 DTO를 지정했습니다.


@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();


엔티티

@Getter
@MappedSuperclass
@SuperBuilder
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class BasePerfumeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String userId;

private String perfumeName;

private String image;

@CreatedDate
private LocalDateTime createdDate;

@LastModifiedDate
private LocalDateTime modifiedDate;

public void update(String perfumeName, String image){
this.perfumeName = perfumeName;
this.image = image;
}
}


perfumeName과 count(userId)가 필요해서 따로 dto를 생성했습니다.

@Getter
public class PerfumeListResponseDto {
private Long id;
private String perfumeName;
private String image;
private int countPerfumeName;

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


테스트를 실행하면

No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.patrick.perfume.web.dto.PerfumeListResponseDto]

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.patrick.perfume.web.dto.PerfumeListResponseDto]


에러가 발생합니다.

dto형태가 문제인 것 같은데 어떤 식으로 바꿔야하는지 감을 못잡겠습니다...ㅠ


------------추가

쿼리문의 리턴타입과 Dto를 같게해도 마찬가지로 에러가 발생합니다
public PerfumeListResponseDto(String perfumeName, int countPerfumeName, String image){
this.perfumeName = perfumeName;
this.countPerfumeName = countPerfumeName;
this.image = image;
}



0
  • 답변 2

  • star16m
    788
    2021-09-02 01:39:46

    jpa 에서 projection 을 도입하시는 방법이 있습니다

    말씀하신 케이스로는 인터페이스를 정의하시고

    진행하시면 될듯합니다

  • MelRanG
    719
    2021-09-02 13:05:19 작성 2021-09-02 13:59:04 수정됨

    star16m 

    projection를 서치해봤는데 엔티티명에 있는 데이터중 일부를 가져올 때 사용한다는 글을 봤습니다.

    count로직을 수행한 countPerfumeName의 경우 엔티티에 없는. 단순 count(userId)를 한 변수인데 이 부분을 어떻게 해결해야할까요??


    발생하는 에러는

    Null return value from advice does not match primitive return type for: public abstract int com.patrick.perfume.domain.favoriteperfume.fa.getCountPerfumeName()

    입니다


    ------추가

    count()문에 AS로 countPerfumeName으로 이름을 변경하니 해결됐습니다 감사합니다!!

  • 로그인을 하시면 답변을 등록할 수 있습니다.