Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: hibernate, jpa, query

Как вы создавали и использовали кастомные запросы в Hibernate?

Вопрос направлен на проверку умения выходить за рамки стандартных CRUD-операций и создавать специализированные запросы к БД с помощью Hibernate.

Короткий ответ

Кастомные запросы в Hibernate создаются primarily с помощью JPQL (язык запросов, похожий на SQL, но работающий с сущностями) или нативного SQL. JPQL-запросы определяются с помощью аннотации @Query прямо в репозитории. Нативные SQL-запросы используются для сложных, специфичных для БД операций, но они привязывают код к конкретной СУБД.

Длинный ответ

Когда встроенных методов Spring Data JPA (например, findByFirstName) недостаточно, используются кастомные запросы. Hibernate и Spring Data JPA предоставляют для этого несколько основных способов.

Способы создания кастомных запросов:

  1. JPQL (Java Persistence Query Language):

    • Это объектно-ориентированный язык запросов. Вместо таблиц и колонок вы используете имена сущностей и их полей.

    • Записывается с помощью аннотации @Query в интерфейсе-репозитории.

    public interface UserRepository extends JpaRepository<User, Long> {
        // Поиск пользователей по имени (JPQL)
        @Query("SELECT u FROM User u WHERE u.firstName = :name")
        List<User> findUsersByName(@Param("name") String name);
    
        // Более сложный пример с JOIN
        @Query("SELECT u FROM User u JOIN u.orders o WHERE o.total > :amount")
        List<User> findUsersWithOrdersGreaterThan(@Param("amount") BigDecimal amount);
    }
  2. Нативный SQL (Native Queries):

    • Используется, когда нужна специфичная для базы данных функциональность или очень сложный запрос, который невозможно выразить в JPQL.

    • Для этого в аннотации @Query устанавливается атрибут nativeQuery = true.

    public interface UserRepository extends JpaRepository<User, Long> {
        @Query(value = "SELECT * FROM users u WHERE u.email LIKE '%gmail.com'", nativeQuery = true)
        List<User> findUsersWithGmail();
    }

Вывод:
JPQL является предпочтительным способом для большинства случаев, так как он переносим между разными СУБД. Нативный SQL следует использовать осторожно, только когда это действительно необходимо.

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Spring

    Spring

Ключевые слова

#hibernate

#jpa

#query

Подпишись на Java Developer в телеграм