org.springframework.data.mapping.model.MappingInstantiationException:
Failed to instantiate com.example.springwebflux.domain.feed.router.dto.response.QueryFeedList$FeedElement
using constructor fun `<init>`(java.util.UUID, kotlin.String, kotlin.String, kotlin.String):
com.example.springwebflux.domain.feed.router.dto.response.QueryFeedList.FeedElement with arguments
74e4f5ea-6a29-42ba-a78f-8d42c71599a1,asdfjk,asdflj,null at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(ClassGeneratingEntityInstantiator.java:278)
~[spring-data-commons-3.1.3.jar:3.1.3] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
jpql을 사용해 쿼리하던 도중 다음과 같은 에러가 발생했다.
data class QueryFeedList(
val feedList: List<FeedElement>,
) {
data class FeedElement(
val id: UUID,
val title: String,
val content: String,
val name: String, // 기존에는 userName이었음
)
}
@Query(
"""
select
f.id,
f.title,
f.content,
u.name
from tbl_feed as f
inner join tbl_user as u
on f.user_id = u.id
"""
)
suspend fun queryAllFeed(): Flux<FeedElement>
저기 FeedElement의 값이 f.~, u.~해서 조회하는 값이랑 똑같아야 JPQL이 제대로 만들어진다.
querydsl-jpa를 쓸 때는 dto의 실제 이름과는 상관 없었기 때문에
컬럼에 테이블 이름을 굳이 나타낼 필요가 없었는데 R2DBC를 쓸 때는 jpql을 써야하기 때문에
컬럼에 테이블 이름을 나타내는 것도 필요하겠다 생각했다.