Подтвердить что ты не робот

Что такое именованный запрос?

Я прочитал его определение, но не смог полностью понять.

4b9b3361

Ответ 1

Позвольте мне угадать: вы наткнулись на концепцию именованных запросов, и вы задаетесь вопросом, где она вписывается в SQL.

Хорошо, по моим сведениям, именованные запросы не имеют ничего общего с "чистым" SQL, но они представляют собой концепцию, найденную в различных структурах ORM (объектно-реляционное сопоставление), ala Java Persistence API.

В принципе, именованный запрос является одним из способов сопоставления имени с запросом, который может быть вызван несколько раз в вашем коде в разных местах.

Итак, вместо использования

"SELECT i FROM Item i WHERE i.product.categoryID LIKE :cID"

как строка в разных местах вашего кода, вы используете это:

@NamedQuery( 
  name="MyEntity.getItemsPerProductCategory", 
  query="SELECT i FROM Item i WHERE i.product.categoryID LIKE :cID"
)

а затем вы ссылаетесь на этот запрос, используя MyEntity.getItemsPerProductCategory.

Пример, взятый из этого сайта.

Вы можете удивиться, почему это полезно?

Реализация JPA, например Hibernate, может проверить правильность именованных запросов при запуске, поэтому одним способом вы получите безопасную проверку типа, Это поможет уменьшить ошибки во время выполнения.

Ответ 2

Именованный запрос - это статический запрос, выраженный в метаданных. Названия Qeery привязаны к единице сохранения. Ниже приведен пример определения именованного запроса на языке запросов Java Persistence:

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

Ниже приведен пример использования именованного запроса:

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

Ответ 3

Я считаю, что вы говорите о спящем режиме.

Простыми словами, именованный запрос - это запрос, который можно идентифицировать по имени. Вы можете определить именованный запрос, как показано ниже, и использовать его по его имени.

@NamedQuery name="findAllUsers" query="SELECT u FROM Users u"
findByNamedQuery("findAllUsers")

У вас есть больше параметров и вы можете передать в него параметры.

Ответ 4

Существует два способа определения запросов в JPA, Dynamic и Static. Именованные запросы - последние (т.е. Статические). Вы должны определить запрос в файле метаданных XML или непосредственно в реальном объекте. Обратите внимание, что эти запросы имеют глобальную область видимости (то есть во всей единице непрерывности), то есть независимо от того, где они определены, имена должны быть уникальными, например. если вы определяете именованный запрос и Entity "Employee", а именованный запрос называется "findAll", и у вас есть другой именованный запрос под названием "findAll", определенный в Entity, называемом "Department", тогда эти запросы будут сталкиваться.

Как правило, имена имен именованных запросов являются префиксами с именем Entity, к которому они применяются, например:

    @NamedQueries({@NamedQuery(name="Employee.findAll", query="select e from Employee e"),
               @NamedQuery(name="Employee.findByName", query="select e from Employee e where e.name = :name")})
    @Entity
    public class Employee ... {
    ....

В качестве общей передовой практики любые запросы, которые не нужно динамически создавать (например, запрос, который имеет неопределенное количество и предложения во время компиляции, поскольку они определяются фильтрами, определенными пользователем, во время выполнения, необходимо будет построить динамически) должны выполняться через собственный запрос, поскольку они обрабатываются/конвертируются в SQL один раз при запуске приложения, а не каждый раз, когда используется запрос. Поэтому они более эффективны, чем динамические запросы.

Ответ 5

Согласно http://www.objectdb.com/java/jpa/query/named Именованный запрос представляет собой статически определенный запрос с предопределенной неизменяемой строкой запроса. Использование именованных запросов вместо динамических запросов может улучшить организацию кода, отделив строки запроса JPQL от кода Java. Он также обеспечивает использование параметров запроса, а не динамическое встраивание литералов в строку запроса и приводит к более эффективным запросам.

Вот пример, Вы должны импортировать

import javax.persistence.NamedQueries; import javax.persistence.NamedQuery;

@NamedQueries({
    @NamedQuery(name = "Tenantdata.findAll", query = "SELECT c FROM Tenantdata c"),
    @NamedQuery(name = "Tenantdata.findById", query = "SELECT c FROM Tenantdata c WHERE c.id = :id")
}    
)

Ответ 6

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

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

(TechNet: определение именованных запросов в представлении источника данных (службы Analysis Services))

@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u")
    , @NamedQuery(name = "Users.findById", query = "SELECT u FROM Users u WHERE u.id = :id")
    , @NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username")
    , @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")
    , @NamedQuery(name = "Users.findByStatus", query = "SELECT u FROM Users u WHERE u.status = :status")
    , @NamedQuery(name = "Users.findByDateCreated", query = "SELECT u FROM Users u WHERE u.dateCreated = :dateCreated")})
public class Users implements Serializable {