Acho que a maneira mais fácil de fazer isso é usar a chamada projeção. Ele pode mapear os resultados da consulta para interfaces. Usar SqlResultSetMapping
é inconveniente e torna seu código feio :).
Um exemplo direto do código-fonte JPA da 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();
}
}
Você também pode usar este método para obter uma lista de projeções.
Verifique esta entrada de documentos JPA de dados de primavera para obter mais informações sobre as projeções.
Nota 1:
Lembre-se de ter sua User
entidade definida como normal - os campos da interface projetada devem coincidir com os campos desta entidade. Caso contrário, o mapeamento de campo pode ser interrompido ( getFirstname()
pode retornar o valor do sobrenome etc.).
Nota 2:
Se você usar a SELECT table.column ...
notação, sempre defina aliases que correspondam aos nomes da entidade. Por exemplo, este código não funcionará corretamente (a projeção retornará nulos para cada getter):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Mas isso funciona bem:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
No caso de consultas mais complexas, prefiro usar o JdbcTemplate
repositório personalizado.