Jakarta Persistence Query Language ( JPQL ; ранее Java Persistence Query Language) — это платформенно-независимый объектно-ориентированный язык запросов [1] : 284, §12, определенный как часть спецификации Jakarta Persistence (JPA; ранее Java Persistence API).
JPQL используется для выполнения запросов к сущностям, хранящимся в реляционной базе данных. Он во многом вдохновлен SQL , и его запросы напоминают запросы SQL по синтаксису, [1] : 17, §1.3 , но работают с объектами сущностей JPA, а не напрямую с таблицами базы данных. [1] : 26, §2.2.3
Помимо извлечения объектов ( SELECT
запросов), JPQL поддерживает запросы на основе наборов UPDATE
и DELETE
.
Примеры классов JPA, геттеров и сеттеров опущены для простоты.
@Entity public class Author { @Id private Integer id ; private String firstName ; private String lastName ; @ManyToMany private List <Book> books ; } @Entity public class Book { @Id private Integer id ; private String title ; private String isbn ; @ManyToOne private Publisher publisher ; @ManyToMany private List < Автор > authors ; } @Entity public class Publisher { @Id private Integer id ; private String name ; private String address ; @OneToMany ( mappedBy = " publisher " ) private List <Book> books ; }
Тогда простой запрос для получения списка всех авторов, отсортированных в алфавитном порядке, будет выглядеть так:
ВЫБРАТЬ ИЗ Автор УПОРЯДОЧИТЬ ПО . имя , . фамилия
Чтобы получить список авторов, когда-либо опубликованных издательством XYZ Press:
SELECT DISTINCT a FROM Author a INNER JOIN a . books b WHERE b . publisher . name = 'XYZ Press'
JPQL поддерживает именованные параметры, которые начинаются с двоеточия ( :
). Мы могли бы написать функцию, возвращающую список авторов с заданной фамилией, следующим образом:
импорт javax.persistence.EntityManager ; импорт javax.persistence.TypedQuery ; ...public List < Author > getAuthorsByLastName ( String lastName ) { String queryString = "ВЫБРАТЬ a ИЗ Автор a " + "ГДЕ a.lastName ЕСТЬ NULL ИЛИ LOWER(a.lastName) = LOWER(:lastName)" ; TypedQuery < Автор > query = getEntityManager ( ). createQuery ( queryString , Author.class ) ; query.setParameter ( " lastName " , lastName ); return query.getResultList ( ) ; }
JPQL основан на языке запросов Hibernate (HQL), более раннем нестандартном языке запросов, включенном в библиотеку объектно-реляционного отображения Hibernate .
Hibernate и HQL были созданы до спецификации JPA. Начиная с Hibernate 3 JPQL является подмножеством HQL.