SMALL
어떤 문제가 생겼나요?
List<ReviewResponse> reviewResponses1 = queryFactory.select(Projections.constructor(
ReviewResponse.class,
qBoard.id,
qBoard.title,
qBoard.problem,
qBoard.question,
qBoard.category,
qBoard.status.as("action"),
qBoard.views.as("heartCount"), //TODO: 수정해야함.
qBoard.createdAt
))
.from(qBoard)
.join(qBoard.category)
.orderBy(qBoard.createdAt.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
return new PageImpl<>(reviewResponses1, pageable, 0);
위와 같이 해당 record 클래스에 생성자 주입 방식으로 DTO 로 변환하는 작업에서 에러가 발생하였다.
처음에 내가 생성자 순서를 잘못했나? 여러가지를 테스트 해보았지만 결국엔 똑같은 에러가 발생하였다.
어떤 시도를 하였나요?
생성자 순서를 확인하고 구글링을 통해 왜 이런지 이유를 알게 되었다.
(@ElementCollection 필드들) 의 타입을 인지하지 못하여 다음과 같은 에러를 발생시킨다는 점이였다.
쿼리를 따로 날리는 방법 / querydsl transform 이 방법이 있었지만, 결국엔 Entity 로 가져와 stream 매서드를 활용하여
데이터를 다시 return 을 시켜줬다.
어떻게 해결했나요?
List<Board> boards = queryFactory
.selectFrom(qBoard)
.orderBy(qBoard.createdAt.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
List<ReviewResponse> reviewResponses = boards.stream()
.map(board -> new ReviewResponse(
board.getId(),
board.getTitle(),
board.getProblem(),
board.getQuestion(),
board.getCategory(),
board.getStatus(),
0L, //TODO: 수정 요망
board.getCreatedAt()
))
.toList();
return new PageImpl<>(reviewResponses, pageable, 0);
이를 통해 새롭게 알게된것들
@ElementCollection 필드 값들은 생성자 주입이 안된다.
방법으로는 쿼리 따로 날리는것과 querydsl transform 을 써야 하지만, 내가 해결한 방법도 괜찮은점을 확인하여 써보았다.
관련된 자료들을 따로 링크해서 올립니다.
반응형
LIST
'트러블슈팅' 카테고리의 다른 글
불필요한 연산 VS 불필요한 저장 (0) | 2023.09.02 |
---|---|
없는 페이지 요청시 Hikari 연결 누수 (0) | 2023.08.23 |
Spring 3.1.2 QueryDSL 설정 오류 (0) | 2023.08.22 |
STOMP 테스트 코드 에러 (0) | 2023.08.10 |
AWS에 파일 업로드 Window 권한 오류 (0) | 2023.06.29 |