Te damos la bienvenida a proyecto on line, ahora vas a hallar la resolución a lo que estás buscando.
Solución:
Me sorprendió profundamente cuando me encontré con esto por primera vez, pero sí, puede mapear los resultados de las consultas usando @SqlResultSetMapping solo para escalares y entidades administradas.
Supongo que lo mejor que puede hacer es omitir el mapeo automático. La consulta sin mapeo devolvería List
y puedes mapearlo de la manera que necesites.
Otro enfoque sería usar @MappedSuperclass. La clase indicada como @MappedSuperclass (CustomStudent en su caso) puede usarse (aunque no estoy seguro al 100%) en @SqlResultSetMapping. pero debe introducir la jerarquía de herencia, es decir, su entidad Student debe extender CustomStudent. Eso apestaría la mayor parte del tiempo del diseño OO adecuado, porque la herencia sería un poco artificial…
Puedes hacer algo como
@NamedQuery(name="findWhatever", query="SELECT new path.to.dto.MyDto(e.id, e.otherProperty) FROM Student e WHERE e.id = ?1")
Entonces, el objeto MyDto solo necesitaría un constructor definido con los campos correctos, es decir
public MyDto(String id, String otherProperty) this.id = id; this.otherProperty = otherProperty;
¿Qué hay de JPA 2.1 ConstructorResult?
@SqlResultSetMapping(
name="studentPercentile",
classes=
@ConstructorResult(
targetClass=CustomStudent.class,
columns=
@ColumnResult(name="ID"),
@ColumnResult(name="FIRST_NAME"),
@ColumnResult(name="LAST_NAME")
)
)
@NamedNativeQuery(name="findStudentPercentile", query="SELECT * FROM STUDENT", resultSetMapping="studentPercentile")