什么是命名查询?

时间:2010-12-23 08:40:54

标签: sql

我已阅读其定义,但无法完全理解。

6 个答案:

答案 0 :(得分:31)

让我猜一下:你偶然发现了命名查询的概念,你想知道它在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引用此查询。

取自this site

的示例

您可能想知道为什么这有用吗?

Hibernate这样的JPA实现可以在启动时检查命名查询的有效性,因此在某种程度上,您可以进行安全类型检查。这有助于减少运行时的错误。

答案 1 :(得分:6)

我相信你在谈论Hibernate。

简单来说,命名查询是可以通过名称标识的查询。您可以按如下所示定义命名查询,并按名称使用它。

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

您有更多选项,也可以将参数传递给它。

答案 2 :(得分:5)

命名查询是在metadata中表示的静态查询。查询名称的范围限定为持久性单元。 以下是Java持久性查询语言中命名查询的定义示例:

@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 :(得分:2)

有两种方法可以在JPA中动态和静态地定义查询。命名查询是后者(即静态)。您可以在XML元数据文件中或直接在实际实体上定义查询。注意,这些查询具有全局范围(即,在整个持久性单元中),即无论它们在何处定义,名称必须是唯一的,例如,如果在实体“Employee”上定义命名查询,并且命名查询称为“findAll”,并且在名为“Department”的实体上定义了另一个名为“findAll”的命名查询,则这些查询将发生冲突。

这通常是为什么命名查询的名称是它们适用的实体名称的前缀,例如:

    @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一次,而不是每次使用查询时。因此,它们比动态查询更有效。

答案 4 :(得分:1)

根据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")
}    
)

答案 5 :(得分:-1)

  

命名查询是表示为表的SQL表达式。在命名查询中,您可以指定SQL表达式以选择从一个或多个数据源中的一个或多个表返回的行和列。命名查询与具有行和关系的数据源视图(DSV)中的任何其他表类似,但命名查询基于表达式。

     

命名查询允许您在DSV中扩展现有表的关系模式,而无需修改基础数据源。例如,可以使用一系列命名查询将复杂维度表拆分为更小,更简单的维度表,以便在数据库维度中使用。命名查询还可用于将多个数据库表从一个或多个数据源连接到单个数据源视图表中。

TechNet: Define Named Queries in a Data Source View (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 {