Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Создание запросов с использованием языка запросов персистентности Java

Методы EntityManager.createQuery и EntityManager.createNamedQuery используются для обращения к хранилищу данных с помощью запросов Java Persistence.

Метод createQuery используется для создания динамических запросов, заданными непосредственно в бизнес-логике приложения:

public List findWithName(String name) {
return em.createQuery(
    "SELECT c FROM Customer c WHERE c.name LIKE :custName")
    .setParameter("custName", name)
    .setMaxResults(10)
    .getResultList();
}

Метод createNamedQuery используется для создания статических запросов или запросов, определённых в метаданных с аннотацией javax.persistence.NamedQuery. Элемент name в @NamedQuery указывает имя запроса, которое будет присвоено в методе createNamedQuery. Элемент query в @NamedQuery является запросом:

@NamedQuery(
    name="findAllCustomersWithName",
    query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
)

Вот пример createNamedQuery, который использует @NamedQuery:

@PersistenceContext
public EntityManager em;
...
customers = em.createNamedQuery("findAllCustomersWithName")
    .setParameter("custName", "Smith")
    .getResultList();

Именованные параметры в запросах

Именованные параметры — это параметры запроса с префиксом двоеточия (:). Именованные параметры в запросе связываются с аргументом следующим образом:

javax.persistence.Query.setParameter(String name, Object value)

В следующем примере аргумент name бизнес-метода findWithName связывается с именованным параметром :custName запроса путём вызова Query.setParameter:

public List findWithName(String name) {
    return em.createQuery(
        "SELECT c FROM Customer c WHERE c.name LIKE :custName")
        .setParameter("custName", name)
        .getResultList();
}

Именованные параметры чувствительны к регистру и могут использоваться как динамическими, так и статическими запросами.

Позиционные параметры в запросах

Можно использовать в запросах позиционные параметры вместо именованных. Позиционные параметры имеют префикс знака вопроса (?), за которым следует числовая позиция параметра в запросе. Метод Query.setParameter(int position, Object value) используется для установки значений параметров.

В следующем примере бизнес-метод findWithName переписывается для использования входных параметров:

public List findWithName(String name) {
    return em.createQuery(
        "SELECT c FROM Customer c WHERE c.name LIKE ?1")
        .setParameter(1, name)
        .getResultList();
}

Входные параметры нумеруются начиная с 1. Входные параметры чувствительны к регистру и могут использоваться как динамическими, так и статическими запросами.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)