Java Persistence Query Language: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Синтаксис
 
(не показаны 4 промежуточные версии 4 участников)
Строка 20: Строка 20:
| website =
| website =
}}
}}
'''Java Persistence Query Language''' ('''JPQL''') — платформо-независимый [[Объектно-ориентированное программирование|объектно-ориентированный]] [[язык запросов]] являющийся частью спецификации [[Java Persistence API]].
'''Java Persistence Query Language''' ('''JPQL''') — платформенно-независимый [[Объектно-ориентированное программирование|объектно-ориентированный]] [[язык запросов]], являющийся частью спецификации [[Java Persistence API]] (JPA).


JPQL используется для написания запросов к сущностям, хранящимся в реляционной базе данных. JPQL во многом похож на [[SQL]], но в отличие от последнего, оперирует запросами, составленными по отношению к сущностям JPA, в отличие от прямых запросов к таблицам базы данных.
JPQL используется для написания запросов к сущностям, хранящимся в реляционной базе данных. JPQL во многом похож на [[SQL]], но в отличие от последнего, оперирует запросами, составленными по отношению к сущностям JPA, в отличие от прямых запросов к таблицам базы данных.
Строка 27: Строка 27:


== Примеры ==
== Примеры ==
Предположим, имеются-JPA сущности, определённые следующим образом (методы установки и получения значения свойств для простоты опущены):
Предположим, имеются JPA-сущности, определённые следующим образом (методы установки и получения значения свойств для простоты опущены):


<source lang="java5">
<source lang="java5">
Строка 84: Строка 84:
import javax.persistence.EntityManager;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;


...
...
Строка 91: Строка 90:
public List<Author> getAuthorsByLastName(String lastName) {
public List<Author> getAuthorsByLastName(String lastName) {
String queryString = "SELECT a FROM Author a " +
String queryString = "SELECT a FROM Author a " +
"WHERE :lastName IS NULL OR LOWER(a.lastName) = :lastName";
"WHERE LOWER(a.lastName) = :lastName";
Query query = getEntityManager().createQuery(queryString);
Query query = getEntityManager().createQuery(queryString);
query.setParameter("lastName", StringUtils.lowerCase(lastName));
query.setParameter("lastName", lastName.toLowerCase());
return query.getResultList();
return query.getResultList();
}
}
Строка 112: Строка 111:


== Ссылки ==
== Ссылки ==
* [http://java.sun.com/javaee/5/docs/tutorial/doc/bnbuf.html Full Query Language Syntax from The Java EE 5 Tutorial] {{ref-en}}
* [http://docs.oracle.com/javaee/5/tutorial/doc/bnbuf.html Full Query Language Syntax from The Java EE 5 Tutorial] {{ref-en}}
* [http://www.objectdb.com/java/jpa/query JPA Queries and JPQL — a chapter of the ObjectDB Manual] {{ref-en}}
* [http://www.objectdb.com/java/jpa/query JPA Queries and JPQL — a chapter of the ObjectDB Manual] {{ref-en}}
* [http://torpedoquery.org Type safe Hibernate (HQL) query engine — TorpedoQuery] {{ref-en}}
* [http://torpedoquery.org Type safe Hibernate (HQL) query engine — TorpedoQuery] {{ref-en}}

Текущая версия от 22:28, 2 января 2020

Java Persistence Query Language
Класс языка язык запросов
Появился в 2009
Испытал влияние SQL
Сайт eclipse-ee4j.github.io/j…

Java Persistence Query Language (JPQL) — платформенно-независимый объектно-ориентированный язык запросов, являющийся частью спецификации Java Persistence API (JPA).

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

В дополнение к получению объектов (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<Author> authors;
}

@Entity
public class Publisher {
    @Id
    private Integer id;
    private String name;
    private String address;

    @OneToMany(mappedBy = "publisher")
    private List<Book> books;
}

Следующий запрос позволяет получить список авторов, упорядоченных в алфавитном порядке:

SELECT a FROM Author a ORDER BY a.firstName, a.lastName

Запрос для получения списка авторов, когда-либо опубликованных издательством «XYZ Press»:

SELECT DISTINCT a FROM Author a INNER JOIN a.books b WHERE b.publisher.name = 'XYZ Press'

JPQL поддерживает именованные параметры, которые начинаются с двоеточия (:). Функция, возвращающая список авторов с данной фамилией будет выглядеть следующим образом:

import javax.persistence.EntityManager;
import javax.persistence.Query;

...

@SuppressWarnings("unchecked")
public List<Author> getAuthorsByLastName(String lastName) {
    String queryString = "SELECT a FROM Author a " +
                         "WHERE LOWER(a.lastName) = :lastName";
    Query query = getEntityManager().createQuery(queryString);
    
    query.setParameter("lastName", lastName.toLowerCase());
    return query.getResultList();
}

Hibernate Query Language

[править | править код]

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

Hibernate и HQL были созданы до появления спецификации JPA. JPQL является подмножеством языка запросов HQL.