Работает ли нативный SQL-запрос в JPA/Hibernate на уровне ассоциаций?

«Работает ли нативный SQL-запрос в JPA/Hibernate на уровне ассоциаций?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Нативный SQL-запрос (через @NamedNativeQuery или EntityManager.createNativeQuery()) оперирует на уровне таблиц базы данных, а не на уровне объектных ассоциаций JPA. Он выполняется без учета отображения сущностей и их связей.

Пример:

@Entity
@NamedNativeQuery(
    name = "findUserWithAddress",
    query = "SELECT u.*, a.* FROM users u JOIN addresses a ON u.address_id = a.id",
    resultClass = User.class
)
public class User {
    @ManyToOne
    private Address address; // Эта ассоциация игнорируется при построении нативного запроса
}

Чтобы работать с ассоциациями, необходимо:

  1. Вручную сопоставить результаты запроса с объектами.
  2. Использовать JPQL/HQL, который понимает объектную модель и ассоциации.
  3. Применить @SqlResultSetMapping для детального кастомного маппинга результатов SQL в сущности и их связи.