@Query 조인 쓰면 Dto에 매핑 안 되는 문제 발생
@SqlResultSetMapping 및 @ConstructorResult 사용
@SqlResultSetMapping 및 @ConstructorResult는 Java Persistence API (JPA)에서 네이티브 쿼리의 결과를 엔터티나 DTO와 매핑하기 위해 사용되는 어노테이션입니다.
@SqlResultSetMapping (SQL 결과 매핑):
@SqlResultSetMapping 어노테이션은 SQL 쿼리의 결과를 엔터티나 DTO와 같은 자바 객체에 매핑할 때 사용됩니다.@SqlResultSetMapping 어노테이션의 간단한 예시입니다.@SqlResultSetMapping(
name = "MyResultMapping",
entities = {
@EntityResult(
entityClass = MyEntity.class,
fields = {
@FieldResult(name = "id", column = "entity_id"),
@FieldResult(name = "name", column = "entity_name")
}
)
}
)
name: 결과 매핑의 이름을 지정합니다.entities: 엔터티 매핑을 정의합니다. 여기서는 MyEntity 클래스에 매핑합니다.fields: 엔터티의 필드와 결과의 컬럼 간의 매핑을 정의합니다.@ConstructorResult (생성자 결과):
@ConstructorResult 어노테이션은 생성자를 통해 객체를 생성하고 결과를 해당 생성자의 매개변수로 매핑할 때 사용됩니다.@ConstructorResult 어노테이션의 예시입니다.@SqlResultSetMapping(
name = "ApplicationEssayMapping",
classes = @ConstructorResult(
targetClass = ApplicationEssayResDto.class,
columns = {
@ColumnResult(name = "username", type = String.class),
@ColumnResult(name = "email", type = String.class),
@ColumnResult(name = "essay", type = String.class)
}
)
)
targetClass: 결과를 매핑할 대상 클래스를 지정합니다. 위의 예시에서는 ApplicationEssayResDto 클래스입니다.columns: 생성자의 매개변수와 컬럼 간의 매핑을 정의합니다. @ColumnResult 어노테이션을 사용하여 각 컬럼의 이름과 타입을 지정합니다.이러한 어노테이션들은 네이티브 쿼리의 결과를 자바 객체에 매핑할 때 유용하게 사용됩니다.