Я думаю, що найпростіший спосіб зробити це - використовувати так звану проекцію. Він може зіставити результати запитів з інтерфейсами. Використання SqlResultSetMapping
є незручним і робить ваш код негарним :).
Приклад прямо з джерельних даних JPA вихідного коду:
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();
}
}
Ви також можете використовувати цей метод, щоб отримати список проекцій.
Ознайомтесь із цим весняним записом про документи JPA для отримання додаткової інформації про прогнози.
Примітка 1:
Не забудьте визначити свою User
сутність як звичайну - поля з проектованого інтерфейсу повинні збігатися з полями в цій сутності. В іншому випадку відображення полів може бути порушено ( getFirstname()
може повернутися значення прізвища тощо).
Примітка 2:
Якщо ви використовуєте SELECT table.column ...
нотацію, завжди визначайте псевдоніми, що відповідають іменам сутності. Наприклад, цей код не буде працювати належним чином (проекція поверне нулі для кожного геттера):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Але це чудово працює:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
У випадку більш складних запитів я б скоріше використовував JdbcTemplate
спеціальне сховище.