java - example - Spring Data JPA: ¿Cómo puede Query devolver Non-Entities Objects o List of Objects?
spring data jpa join query example (3)
¿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")
Estoy usando datos de primavera JPA en mi proyecto. Estoy jugando con millones de discos. Tengo un requisito en el que tengo que buscar datos para varias tablas y construir un objeto y luego pintarlo en una IU. Ahora cómo lograr esto mis repositorios de datos de primavera. He leído que se puede lograr mediante consultas nativas con nombre.
Si la consulta nativa con nombre no devuelve una entidad o una lista de entidades, podemos asignar el resultado de la consulta a un tipo de devolución correcto utilizando la anotación @SqlResultSetMapping.
Pero cuando estoy tratando de usar @SqlResultSetMapping
está tomando otra entityResult . Lo que quiero decir es que es solo la transformación de un resultado de consulta al conjunto de resultados de la entidad solamente, pero quiero un conjunto de resultados de objetos que no sean entidades.
@SqlResultSetMapping(
name="studentPercentile",
entities={
@EntityResult(
entityClass=CustomStudent.class,
fields={
@FieldResult(name="id", column="ID"),
@FieldResult(name="firstName", column="FIRST_NAME"),
@FieldResult(name="lastName", column="LAST_NAME")
}
)
}
)
@NamedNativeQuery(
name="findStudentPercentile",
query="SELECT * FROM STUDENT",
resultSetMapping="studentPercentile")
En el ejemplo anterior, estoy tratando de obtener un resultado de la Entidad de estudiante en otro pojo '' CustomStudent '', que no es una entidad. ( Este ejemplo estoy tratando de ejecutar solo para fines POC, el uso real es muy complicado, con consultas complicadas que devuelven diferentes resultados ).
¿Cómo lograr el uso anterior? ¿Hay alguna otra manera además de usar la consulta de nombre que mi método de repositorio devuelva objetos que no sean Entidades?
Me sorprendió mucho cuando encontré esto por primera vez, pero sí, puede asignar los resultados de la consulta utilizando @SqlResultSetMapping solo a escalares y entidades administradas.
Lo mejor que puedes hacer, supongo, es omitir el mapeo automático. La consulta sin asignación devolverá List<Object[]>
y podrá asignarla de la forma que necesite.
Otro enfoque sería usar @MappedSuperclass. La clase indicada como @MappedSuperclass (CustomStudent en su caso) puede ser (aunque no está seguro al 100%) utilizada en @SqlResultSetMapping. pero debe introducir la jerarquía de herencia, es decir, su entidad Student debe extender CustomStudent. Eso mataría la mayor parte del tiempo del diseño correcto de OO, 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; }