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
반응형
'Programming-[Backend] > Spring' 카테고리의 다른 글
[TIL] DB save 테스트 Id값 증가, Auto Increment 값은 transaction에 포함되지 않음 (0) | 2021.05.02 |
---|---|
[TIL] Swagger 날짜 입력 : @DateTimeFormat- Controller의 파라미터 중 LocalDate 처리 (0) | 2021.05.01 |
[TIL] @NotNull, @NonNull, @NotEmpty, @NotBlank, required=true 컨트롤러 파라미터 필수값 처리 (0) | 2021.04.28 |
[TIL] Controller 필드 중 LocalDate 처리하기, @DateTimeFormat, Swagger (0) | 2021.04.28 |
[TIL][TDD] 스프링 TDD 개발 방법론 개요 (0) | 2021.04.22 |