Saltar al contenido

Spring Data JPA: ¿Cómo puede Query devolver objetos que no son entidades o una lista de objetos?

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")

Te mostramos las reseñas y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *