Myślę, że najłatwiej to zrobić używając tzw. Projekcji. Może mapować wyniki zapytań do interfejsów. Używanie SqlResultSetMapping
jest niewygodne i sprawia, że kod jest brzydki :).
Przykład bezpośrednio z kodu źródłowego JPA danych sprężyny:
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();
}
}
Możesz również użyć tej metody, aby uzyskać listę prognoz.
Sprawdź ten wiosenny wpis w dokumentach JPA, aby uzyskać więcej informacji na temat prognoz.
Notatka 1:
Pamiętaj, aby mieć swoją User
encję zdefiniowaną normalnie - pola z projektowanego interfejsu muszą być zgodne z polami w tej encji. W przeciwnym razie mapowanie pól może zostać uszkodzone ( getFirstname()
może zwrócić wartość nazwiska i tak dalej).
Uwaga 2:
Jeśli używasz SELECT table.column ...
notacji, zawsze definiuj aliasy pasujące do nazw z encji. Na przykład ten kod nie będzie działał poprawnie (projekcja zwróci wartości null dla każdego gettera):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Ale to działa dobrze:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
W przypadku bardziej złożonych zapytań wolałbym zamiast tego używać JdbcTemplate
niestandardowego repozytorium.