본문 바로가기

Programming-[Backend]/Spring

[TIL][에러] 스프링 Projections constructor, No constructor found for class

728x90
반응형

상황

QueryDsl을 이용해서 Entity 에서 전체 필드를 호출하는 것이 아니라, 특정 필드들만 호출하거나, 연관된 다른 Entity의 필드를 동시에 호출하고 싶다면 아래와 같이 Projections.constructor를 사용한다.

 

Repository쪽 코드

1
2
3
4
5
6
7
8
9
10
jpaQueryFactory
    .select(Projections.constructor(XxxDto.class
        , Xxx1Entity.id.as("id")
        , Xxx1Entity.name.as("siteName")
        , Xxx2Entity.visitor
        )
    )
    .from(...)
    ...
 
cs

 

XxxDto쪽 코드

1
2
3
4
5
6
7
8
9
@Data
@Builder
public class XxxDto extends ... {
    private Long id;
    private String siteName;
    private String visitor;
}
 
...생성자 코드
cs

에러

No constructor found for class ... with parameters: [ ... ]

이렇게 constructor를 구성하는 class가 없다는 에러가 나올 수 있다.

 

원인과 해결책

 

XxxDto.class에서 정의하는 필드와 Repository에서 select로 표현하고자하는 필드가 완전히 일치하지 않아서 발생하는 문제이다.

 

1. 모든 필드의 타입이 일치해야 한다.

2. 모든 필드의 순서가 일치해야 한다.

3. Repo. 쪽에서의 필드명과 XxxDto 쪽에서의 필드명이 일치해야한다. 만약 다르다면, Repo. 쪽에서 위 코드와 같이 .as("별칭") 메서드를 사용해서 XxxDto 쪽에서의 필드명과 같도록 별칭을 지정해주도록 한다.

728x90
반응형