• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

constructor 방식 Enum List argument type mismatch 질문

23.08.05 17:30 작성 조회수 461

0

안녕하세요 영한님! 저는 강의 후에 개인 프로젝트를 진행중인데요

@Column(nullable = false)
@ElementCollection
private List<Tech> techs;

Post class에 해당 Enum type List가 있습니다.

package project.como.domain.post.model;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum Tech {
   Java("Java"),
   Spring("Spring");

   private String stack;
}

그런데 Projections.constructor 방식으로 Dto를 만들때 에러가 발생합니다.

List<PostAbstractResponseDto> content = queryFactory
				.select(Projections.constructor(PostAbstractResponseDto.class,
						post.title,
						post.category,
						post.state,
						post.techs
				))
				.from(post)
				.where(stateEq(condition.getState()),
						categoryEq(condition.getCategory()),
						techsContains(condition.getTechs()))
				.offset(pageable.getOffset())
				.limit(pageable.getPageSize())
				.fetch();

post.techs와 조건식을 제외하고 조회할 때는 정상적으로 잘 동작하지만, post.techs를 넣는 경우에 argument type mismatch 에러가 발생하네요.

 

무슨 문제인지 궁금합니다. 감사합니다 :)

답변 2

·

답변을 작성해보세요.

0

안녕하세요. gksrhs97님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.07

안녕하세요, 인프런 AI 인턴이에요.
에러 메시지를 보면 “argument type mismatch” 오류가 발생한 것 같아요. 이는 프로젝션 생성자 방식으로 Dto를 만들 때 techs 필드에 대한 타입이 일치하지 않는다는 의미에요.

문제를 해결하기 위해서는 프로젝션 생성자의 PostAbstractResponseDto 클래스에 대한 생성자를 수정해야 해요. 타입이 일치하도록 List<tech>를 받을 수 있는 생성자를 추가해보세요.</tech>

예를 들어, PostAbstractResponseDto 클래스에 다음과 같은 생성자를 추가해보세요.

@AllArgsConstructor
public class PostAbstractResponseDto {
private String title;
private String category;
private String state;
private List<tech> techs;</tech>

// 기본 생성자
public PostAbstractResponseDto() {

}

// 모든 필드를 초기화하는 생성자
public PostAbstractResponseDto(String title, String category, String state, List<Tech> techs) {
    this.title = title;
    this.category = category;
    this.state = state;
    this.techs = techs;
}

}

이렇게 생성자를 추가하고 나면 프로젝션 생성자에서 해당 생성자를 사용할 수 있게 될 것입니다.
해당 수정을 통해 오류가 해결되길 바랍니다. 추가 질문이 있으시면 언제든지 물어보세요. 좋은 하루 보내세요!

gksrhs97님의 프로필

gksrhs97

질문자

2023.08.07

이미
@NoArgsConstructor, @AllArgsConstructor 롬복을 사용중이었고 혹시 몰라 어노테이션 빼고 기본 생성자, 모든 필드 생성자 달아줘도 똑같은 에러가 납니다.