Что такое JPQL, HQL и чем он отличается от SQL

JPA Query Language (JPQL) и Hibernate Query Language (HQL) являются языками запросов, используемыми для работы с объектно-реляционными отображениями (ORM).

Основное отличие между JPQL/HQL и SQL состоит в том, что JPQL/HQL оперируют на уровне объектов, в то время как SQL работает с реляционными таблицами в базе данных.

Вот пример синтаксиса JPQL:


TypedQuery<Product> query = entityManager.createQuery(
    "SELECT p FROM Product p WHERE p.price > :price", Product.class);
query.setParameter("price", 100);
List<Product> products = query.getResultList();
    

А вот пример синтаксиса SQL:


SELECT * FROM products WHERE price > 100;
    

Как видите, JPQL/HQL позволяют работать с объектами, именами полей и связями между объектами, в то время как SQL использует таблицы, столбцы и операторы сравнения. Это позволяет более гибко использовать объектно-реляционные отображения и упрощает работу с данными в приложении.

Детальный ответ

Что такое JPQL и HQL и чем они отличаются от SQL?

JPQL (Java Persistence Query Language) и HQL (Hibernate Query Language) – это языки запросов, которые используются для работы с объектно-реляционными отображениями (ORM) в Java приложениях. Оба языка являются альтернативами к стандартному SQL, который используется для работы с реляционными базами данных.

JPQL

JPQL был разработан для использования в Java Persistence API (JPA), которая представляет собой стандартную спецификацию для работы с объектно-реляционными отображениями в Java. Он предоставляет средства для выполнения запросов на объектную модель данных, используя синтаксис, похожий на SQL. Однако, JPQL оперирует не на таблицах и столбцах, а на сущностях и их атрибутах.

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

        
            EntityManager em = ...; // инициализация EntityManager

            TypedQuery<Person> query = em.createQuery(
                "SELECT p FROM Person p WHERE p.age > :age", Person.class); // JPQL запрос

            query.setParameter("age", 18); // задание параметра запроса

            List<Person> results = query.getResultList(); // получение результата запроса
        
    

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

HQL

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

Пример HQL запроса:

        
            Session session = ...; // инициализация Session

            Query query = session.createQuery(
                "SELECT p FROM Person p WHERE p.age > :age"); // HQL запрос

            query.setParameter("age", 18); // задание параметра запроса

            List<Person> results = query.list(); // получение результата запроса
        
    

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

Отличия от SQL

JPQL и HQL отличаются от SQL не только в синтаксисе, но и в том, как они взаимодействуют с базами данных. В отличие от SQL, которое оперирует непосредственно с таблицами и столбцами, JPQL и HQL работают на уровне объектов и их атрибутов.

SQL запрос:

        
            SELECT * FROM Person WHERE age > 18
        
    

JPQL запрос:

        
            SELECT p FROM Person p WHERE p.age > 18
        
    

HQL запрос:

        
            SELECT p FROM Person p WHERE p.age > 18
        
    

Еще одно отличие заключается в том, что JPQL и HQL являются независимыми от базы данных языками запросов, тогда как SQL язык специфичен для каждой конкретной базы данных. Это означает, что вы можете использовать JPQL или HQL для работы с любой поддерживаемой базой данных, используя соответствующий провайдер JPA или Hibernate.

Заключение

JPQL и HQL предоставляют удобные средства для работы с объектно-реляционными отображениями в Java приложениях. Они позволяют выполнять запросы на объектную модель данных, используя синтаксис, похожий на SQL, при этом абстрагируясь от деталей работы с базами данных. Надеюсь, данная статья помогла вам понять, что такое JPQL и HQL и в чем их отличия от SQL.

Видео по теме

Spring Boot: добавляем "лайки", используем HQL (JPQL)

Выпуск 120. Знакомство с запросами на HQL и что с этим делать.

NoSQL простым языком: что это и зачем нужно?

Похожие статьи:

Что такое desc в SQL: полное объяснение и примеры использования

Что такое JPQL, HQL и чем он отличается от SQL

Что такое SQL statement и как его использовать для баз данных и веб-разработки