📅  最后修改于: 2021-01-02 15:52:32             🧑  作者: Mango
休眠命名查询是一种通过有意义的名称使用任何查询的方法。就像使用别名一样。 Hibernate框架提供了命名查询的概念,因此应用程序程序员无需将查询分散到所有Java代码。
有两种方法可以在hibernate中定义命名查询:
如果要在休眠模式下使用命名查询,则需要了解@NamedQueries和@NamedQuery批注。
@NameQueries批注用于定义多个命名查询。
@NameQuery批注用于定义单个命名查询。
让我们看一下使用命名查询的示例:
@NamedQueries(
{
@NamedQuery(
name = "findEmployeeByName",
query = "from Employee e where e.name = :name"
)
}
)
在此示例中,我们使用注释在持久化类中定义命名查询。只有三个文件:
在此示例中,我们假设数据库中有一个em表,其中包含4列ID,名称,工作和薪水,并且该表中有一些记录。
它是一个持久类,使用注释来定义命名查询并将该类标记为实体。
package com.javatpoint;
import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@NamedQueries(
{
@NamedQuery(
name = "findEmployeeByName",
query = "from Employee e where e.name = :name"
)
}
)
@Entity
@Table(name="em")
public class Employee {
public String toString(){return id+" "+name+" "+salary+" "+job;}
int id;
String name;
int salary;
String job;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
//getters and setters
}
它是一个配置文件,用于存储有关数据库的信息,例如驱动程序类,URL,用户名,密码和映射类等。
update
org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@localhost:1521:xe
system
jtp
oracle.jdbc.driver.OracleDriver
这是一个Java类,使用命名查询并根据查询打印信息。 getNamedQuery方法使用命名查询并返回Query的实例。
package com.javatpoint;
import java.util.*;
import javax.persistence.*;
import org.hibernate.*;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class Fetch {
public static void main(String[] args) {
StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build();
SessionFactory factory=meta.getSessionFactoryBuilder().build();
Session session=factory.openSession();
//Hibernate Named Query
TypedQuery query = session.getNamedQuery("findEmployeeByName");
query.setParameter("name","amit");
List employees=query.getResultList();
Iterator itr=employees.iterator();
while(itr.hasNext()){
Employee e=itr.next();
System.out.println(e);
}
session.close();
}
}
如果要通过映射文件定义命名查询,则需要使用hibernate-mapping的query元素来定义命名查询。
在这种情况下,您需要创建定义命名查询的hbm文件。其他资源与上面的示例相同,除了持久类Employee.java(不需要使用任何批注)和hibernate.cfg.xml文件(需要指定hbm文件的映射资源)之外。
hbm文件应如下所示:
持久类应如下所示:
package com.javatpoint;
public class Employee {
int id;
String name;
int salary;
String job;
//getters and setters
}
现在,将映射资源包括在hbm文件中,如下所示: