DEV Community

Cover image for 🐾 Hibernate Zoo: Путеводитель по языкам запросов в мире данных 🐾
Olga Lugacheva
Olga Lugacheva

Posted on

🐾 Hibernate Zoo: Путеводитель по языкам запросов в мире данных 🐾

Добро пожаловать в Hibernate Zoo! Сегодня мы прогуляемся по волшебному миру запросов к базе данных. Разные животные-запросы здесь выполняют свои задачи: кто-то собирает информацию, кто-то фильтрует, а кто-то умело жонглирует данными. Давайте познакомимся с ними поближе и разберем, как они работают! 🚀

🐘 Hibernate Native SQL: Слон-гигант

Слон – могучий зверь! Он может поднимать огромные запросы на "родном языке" базы данных — SQL.

@Repository
public interface AnimalRepository extends JpaRepository<Animal, Long> {

    @Query(value = "SELECT * FROM animals WHERE type = :type", nativeQuery = true)
    List<Animal> findByTypeNative(@Param("type") String type);
}

Enter fullscreen mode Exit fullscreen mode

Пример использования:

List<Animal> mammals = animalRepository.findByTypeNative("mammal");
mammals.forEach(System.out::println);

Enter fullscreen mode Exit fullscreen mode

👉 Слон тут явно говорит: "Дай мне всех млекопитающих!"
nativeQuery = true говорит Hibernate, что это настоящий SQL.

💡 Плюсы: Мощный и прямой доступ к базе. Это удобно, если нужно выполнять запросы, которые сложно выразить через JPQL, Criteria API или другие подходы.
😅 Минусы: Не самый гибкий зверь, может быть тяжеловесным для сложных структур. Синтаксис запроса зависит от конкретной базы данных (например, PostgreSQL или MySQL).

🐆 EntityManager Dynamic Queries: Гепард-исследователь

Гепард любит скорость и динамику. Он строит запросы прямо "на ходу".

Пример:

String query = "SELECT a FROM Animal a WHERE a.type = :type";
List<Animal> mammals = entityManager.createQuery(query)
                                     .setParameter("type", "mammal")
                                     .getResultList();

Enter fullscreen mode Exit fullscreen mode

👉 Гепард бежит к млекопитающим со скоростью молнии!

💡 Плюсы: Гибкость.
😅 Минусы: Нужно следить за строками, иначе гепард запутается.

🐻 Criteria API: Медведь-строитель

Медведь основателен и любит все делать по порядку. Он строит запросы как дом: кирпичик за кирпичиком.

Пример:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Animal> query = cb.createQuery(Animal.class);
Root<Animal> animal = query.from(Animal.class);
query.select(animal).where(cb.equal(animal.get("type"), "mammal"));

List<Animal> mammals = entityManager.createQuery(query).getResultList();

Enter fullscreen mode Exit fullscreen mode

👉 Медведь основательно ищет млекопитающих, не пропуская ни одного.

💡 Плюсы: Гибкость и типобезопасность.
😅 Минусы: Немного громоздко.

🐦 JPQL: Попугай-болтун

Попугай говорит на языке сущностей! Он похож на SQL, но более дружелюбный к объектам.

Пример:

List<Animal> mammals = entityManager.createQuery(
    "SELECT a FROM Animal a WHERE a.type = 'mammal'", Animal.class)
    .getResultList();
Enter fullscreen mode Exit fullscreen mode

👉 Попугай просто болтает с базой: "Привет, дай мне всех млекопитающих!"

💡 Плюсы: Похож на SQL, но для сущностей.
😅 Минусы: Меньше возможностей, чем у медведя .

🐥 Spring Data Query Methods: Цыплёнок-помощник

Цыплёнок любит простоту. Вы пишете метод в репозитории, а он сам знает, как искать данные.

Пример:

List<Animal> findByType(String type);

Enter fullscreen mode Exit fullscreen mode

👉 Цыплёнок тут как бы говорит: "Ты скажи, что нужно искать, а я найду!"

💡 Плюсы: Очень просто!
😅 Минусы: Только для стандартных задач.

🦊 Spring Data Specifications: Лис-стратег

Лис умён и хитёр. Он комбинирует запросы как пазлы.

Пример:

Specification<Animal> isMammal = (root, query, cb) -> cb.equal(root.get("type"), "mammal");
List<Animal> mammals = animalRepository.findAll(isMammal);

Enter fullscreen mode Exit fullscreen mode

👉 Лис создаёт стратегию, чтобы найти млекопитающих.

💡 Плюсы: Комбинация условий.
😅 Минусы: Требует опыта.

🐾

Какого зверя выбрать?

Если нужен доступ на уровне SQL – зови слона.
Если любишь гибкость и типобезопасность – позови медведя.
Если хочешь что-то быстро построить – зови гепарда.
Если хочешь простоты – доверься цыплёнку.
Если хочешь гибкость стратегий – позови лиса.
Каждое животное уникально и подходит для своей задачи. В Hibernate Zoo вы найдете друзей на любой случай! 🐾

sqlel

Полезные ссылочки

Hibernate

Spring Data JPA

Top comments (0)