Creo que la forma más sencilla de hacerlo es utilizar la llamada proyección. Puede asignar resultados de consultas a interfaces. Usar SqlResultSetMappinges 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 Userentidad 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 JdbcTemplateun repositorio personalizado.