Creo que la forma más sencilla de hacerlo es utilizar la llamada proyección. Puede asignar resultados de consultas a interfaces. Usar SqlResultSetMapping
es incómodo y hace que su código sea feo :).
Un ejemplo directamente del código fuente JPA de Spring Data:
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(value = "SELECT firstname, lastname FROM SD_User WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
public static interface NameOnly {
String getFirstname();
String getLastname();
}
}
También puede utilizar este método para obtener una lista de proyecciones.
Consulte esta entrada de documentos JPA de datos de primavera para obtener más información sobre las proyecciones.
Nota 1:
Recuerde tener su User
entidad definida como normal: los campos de la interfaz proyectada deben coincidir con los campos de esta entidad. De lo contrario, la asignación de campos podría estar rota ( getFirstname()
podría devolver el valor del apellido, etc.).
Nota 2:
Si usa SELECT table.column ...
notación, defina siempre los alias que coincidan con los nombres de la entidad. Por ejemplo, este código no funcionará correctamente (la proyección devolverá nulos para cada captador):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Pero esto funciona bien:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
En el caso de consultas más complejas, prefiero usar JdbcTemplate
un repositorio personalizado.