Можно ли писать запросы, используя сущности вместо таблиц в JPA?

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

Ответ

Да, это основная концепция JPA (Java Persistence API). ORM (Object-Relational Mapping) позволяет оперировать объектами (сущностями) и их полями, а не таблицами и столбцами базы данных.

Пример JPQL-запроса:

@Entity
public class User {
    @Id
    private Long id;
    private String name;
    // Геттеры и сеттеры
}

// Запрос, использующий сущность User
TypedQuery<User> query = entityManager.createQuery(
    "SELECT u FROM User u WHERE u.name = :name", User.class
);
query.setParameter("name", "John");
List<User> users = query.getResultList();

Преимущества подхода:

  1. Абстракция от БД: Используются имена классов (User) и их полей (name), а не таблиц.
  2. Полиморфизм: Поддерживаются запросы для иерархий наследования сущностей.
  3. Безопасность типов: При использовании TypedQuery или Criteria API ошибки могут быть выявлены на этапе компиляции.
  4. Учет связей: Автоматически учитываются маппинги, заданные аннотациями (@OneToMany, @ManyToOne и др.).