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

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

Unknown

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

Java Persistence query language (JPQL) 

Это язык запросов, практически такой же как SQL, однако, вместо имен и колонок таблиц базы данных, он использует имена классов Entity и их атрибуты. В качестве параметров запросов также используются типы данных атрибутов Entity, а не полей баз данных. В отличии от SQL в JPQL есть автоматический полиморфизм. Также в JPQL используются  функции,  которых  нет  в  SQL:  такие  как  KEY  (ключ  Map'ы),  VALUE (значение  Map’ы),  TREAT  (для  приведения  суперкласса  к  его  объекту- наследнику, downcasting), ENTRY и т.п. 

Полиморфные запросы

В отличии от SQL в запросах JPQL есть автоматический полиморфизм, то есть каждый запрос к Entity возвращает не только объекты этого Entity, но также объекты всех его классов-потомков, независимо от стратегии наследования (например, запрос select * from Animal, вернет не только объекты Animal, но и объекты классов Cat и Dog, которые  унаследованы  от  Animal).  Чтобы  исключить  такое  поведение  используется функция  TYPE  в  where  условии  (например  select  *  from  Animal  a  where  TYPE(a)  IN (Animal, Cat) уже не вернет объекты класса Dog).

В  JPA  запрос  представлен  в  виде  javax.persistence.Query  или javax.persistence.TypedQuery,  полученных  из  EntityManager.  Для  создания  Query  или TypedQuery  необходимо  использовать  метод  EntityManager#createQuery.  Для именованных запросов необходим метод EntityManager#createNamedQuery. 

Запросы, как обычные, так и именованные, формируются из EntityManager: 

Query query = entityManager.createQuery(

    "select p " +

    "from Person p " +

    "where p.name like :name"

);

TypedQuery<Person> typedQuery = entityManager.createQuery(

    "select p " +

    "from Person p " +

    "where p.name like :name", Person.class

);

@NamedQuery(

    name = "get_person_by_name",

    query = "select p from Person p where name = :name"

)

Query query = entityManager.createNamedQuery( "get_person_by_name" );

TypedQuery<Person> typedQuery = entityManager.createNamedQuery(

    "get_person_by_name", Person.class

);

Hibernate Query Language (HQL)

В  Hibernate  HQL-запрос  представлен  org.hibernate.query.Query,  полученный  из Session.  Если  HQL  является  именованным  запросом,  то  будет  использоваться Session#getNamedQuery,  в  противном  случае  требуется  Session#createQuery.  HQL пердоставляет дополнительные возможности по сравнению с JPQL.

org.hibernate.query.Query query = session.createQuery(

    "select p " +

    "from Person p " +

    "where p.name like :name"

);

org.hibernate.query.Query query = session.getNamedQuery( "get_person_by_name" );


Предыдущий вопрос: 34. Как работать с кэшем 2 уровня?

Следующий вопрос: 36.Что такое Criteria API и для чего он используется?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне


Report Page