Ich denke, der einfachste Weg, dies zu tun, ist die Verwendung der sogenannten Projektion. Es kann Abfrageergebnisse Schnittstellen zuordnen. Die Verwendung SqlResultSetMapping
ist unpraktisch und macht Ihren Code hässlich :).
Ein Beispiel direkt aus dem JPA-Quellcode von 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();
}
}
Mit dieser Methode können Sie auch eine Liste der Projektionen abrufen.
Weitere Informationen zu Projektionen finden Sie in den JPA-Dokumenten dieses Frühlings.
Anmerkung 1:
Denken Sie daran, dass Ihre User
Entität als normal definiert ist. Die Felder der projizierten Schnittstelle müssen mit den Feldern in dieser Entität übereinstimmen. Andernfalls kann die Feldzuordnung unterbrochen werden ( getFirstname()
möglicherweise wird der Wert des Nachnamens usw. zurückgegeben).
Anmerkung 2:
Wenn Sie die SELECT table.column ...
Notation verwenden, definieren Sie immer Aliase, die mit den Namen der Entität übereinstimmen. Zum Beispiel funktioniert dieser Code nicht richtig (die Projektion gibt für jeden Getter Nullen zurück):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Aber das funktioniert gut:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Bei komplexeren Abfragen würde ich stattdessen lieber ein JdbcTemplate
benutzerdefiniertes Repository verwenden.