jpql문 주의사항
jpql문에서 예상하지 못한 에러가 발생했다.
@Query("SELECT "
+ "new org.movie.reviewer.domain.movie.dto.response.ActorInfo "
+ "(a.id, a.name, a.role) FROM Actor a "
+ "WHERE a.movie.id = :movieId "
)
List<ActorInfo> findActorsByMovieId(@Param("id") Long movieId);
Using named parameters for method public abstract java.util.List org.movie.reviewer.domain.movie.repository.MovieRepository.findActorsByMovieId(java.lang.Long) but parameter 'Optional[id]' not found in annotated query
파라미터 이름 설정에 관한 문제였다.
이전에는 기본키 이름을 movieId, actorId처럼 설정했지만 이번에는 모두 id이기 때문에 @Param 의 의미를 제대로 알고 사용하지 않았기 때문에 발생한 에러였다.
@Query("SELECT "
+ "new org.movie.reviewer.domain.movie.dto.response.ActorInfo "
+ "(a.id, a.name, a.role) FROM Actor a "
+ "WHERE a.movie.id = :id "
)
List<ActorInfo> findActorsByMovieId(@Param("id") Long movieId);
이 코드처럼 @param에 사용한 변수명을 @Query내에서 사용하도록 해야 정상적으로 실행된다.
dto 리턴 형식
리뷰 목록 조회 api를 구현하던 중 문제가 생겼다.
리턴하고 싶은 형식은 다음과 같다.
{
"id" : "1",
"title" : "리뷰 제목",
"commentCount" : "13",
"user" : {
"id" : "0",
"nickname" : "유저01",
"userImage" : "#"
},
"movie" : {
"id" : "1",
"title" : "영화01",
"movieImage" : "#"
},
}
단건 조회일 경우 reviewId로 user, movie를 따로 받아오면 되지만,
내가 하고싶은건 목록조회이기 때문에 하나씩 따로 받아올 경우 너무 많은 쿼리가 날아가서 문제가 발생할 것 같다.
그래서 user, movie를 평평하게 펴서 정보를 전달해야할지, 아니면 방법이 있을지 좀더 알아봐야될 것 같다.
'토이프로젝트 > 리뷰어(영화 리뷰 사이트)' 카테고리의 다른 글
영화 정보 크롤링 하기 (0) | 2023.05.25 |
---|---|
16일차 - JPA N+1 문제 (0) | 2022.11.07 |
비즈니스 로직 구현과 단위테스트 (0) | 2022.10.28 |
13일차 - 테스트 DB 구성 및 domain단 구현 (0) | 2022.10.27 |
12일차 - api 명세 및 도메인 구현 (0) | 2022.10.27 |