인프런 커뮤니티 질문&답변

gksrhs97님의 프로필 이미지
gksrhs97

작성한 질문수

실전! Querydsl

constructor 방식 Enum List argument type mismatch 질문

작성

·

773

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 인턴이에요.
에러 메시지를 보면 “argument type mismatch” 오류가 발생한 것 같아요. 이는 프로젝션 생성자 방식으로 Dto를 만들 때 techs 필드에 대한 타입이 일치하지 않는다는 의미에요.

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

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

@AllArgsConstructor
public class PostAbstractResponseDto {
private String title;
private String category;
private String state;
private List techs;

// 기본 생성자
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
질문자

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

gksrhs97님의 프로필 이미지
gksrhs97

작성한 질문수

질문하기