프로젝트에서 Querydsl을 사용하여 조회할 때 com.querydsl.core.types.ExpressionException: No constructor found for class
에러가 발생했습니다.
이와 같은 에러를 해결하기위해 원인과 해결방법을 찾아봤습니다.
- 원인
- JPA에서 Projection.constructor를 사용할 때, DTO 클래스에 정의된 필드와 Repository에서 select로 선택한 필드가 완전히 일치하지 않으면 오류가 발생합니다.
- 해결방법
- DTO 클래스의 필드 타입과 Repository에서 select로 지정한 필드의 타입이 일치해야 합니다.
- DTO 생성자에서 사용하는 필드의 순서와 select에서 지정한 필드의 순서가 동일해야 합니다.
- 생성자 프로젝션에서는 필드명이 일치하지 않아도 되지만, 만약 필드명으로 매핑하는 다른 방식(예: @Query에서 DTO로 변환하거나 Tuple 사용)을 사용한다면 as("별칭")을 사용해 필드명을 맞춰줄 수 있습니다.