Hibernate命名查询是一种通过有意义的名称使用任何查询的方法。就像使用别名一样。 Hibernate框架提供了命名查询的概念, 因此应用程序程序员无需将查询分散到所有Java代码。
【Hibernate命名查询】有两种方法可以在hibernate中定义命名查询:
- 通过注释
- 通过映射文件。
如果要在Hibernate状态下使用命名查询, 则需要了解@NamedQueries和@NamedQuery批注。
@NameQueries批注用于定义多个命名查询。
@NameQuery批注用于定义单个命名查询。
让我们看一下使用命名查询的示例:
@NamedQueries(
{
@NamedQuery(
name = "findEmployeeByName", query = "from Employee e where e.name = :name"
)
}
)
通过注释的Hibernate命名查询示例
在此示例中, 我们使用注释在持久化类中定义命名查询。只有三个文件:
- Employee.java
- hibernate.cfg.xml
- 提取演示
Employee.java它是一个持久类, 使用注释来定义命名查询并将该类标记为实体。
package com.srcmini;
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
}
hibernate.cfg.xml它是一个配置文件, 用于存储有关数据库的信息, 例如驱动程序类, URL, 用户名, 密码和映射类等。
<
?xml version='1.0' encoding='UTF-8'?>
<
!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 5.3//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-5.3.dtd">
<
hibernate-configuration>
<
session-factory>
<
property name="hbm2ddl.auto">
update<
/property>
<
property name="dialect">
org.hibernate.dialect.Oracle9Dialect<
/property>
<
property name="connection.url">
jdbc:oracle:thin:@localhost:1521:xe<
/property>
<
property name="connection.username">
system<
/property>
<
property name="connection.password">
jtp<
/property>
<
property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver<
/property>
<
mapping class="com.srcmini.Employee"/>
<
/session-factory>
<
/hibernate-configuration>
FetchData.java这是一个使用命名查询并根据查询显示信息的Java类。 getNamedQuery方法使用命名查询并返回Query的实例。
package com.srcmini;
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<
Employee>
employees=query.getResultList();
Iterator<
Employee>
itr=employees.iterator();
while(itr.hasNext()){
Employee e=itr.next();
System.out.println(e);
}
session.close();
}
}
映射文件的Hibernate命名查询
如果要通过映射文件定义命名查询, 则需要使用hibernate-mapping的query元素来定义命名查询。
在这种情况下, 你需要创建定义命名查询的hbm文件。其他资源与上面的示例相同, 除了持久类Employee.java(不需要使用任何批注)和hibernate.cfg.xml文件(需要指定hbm文件的映射资源)之外。
hbm文件应如下所示:
emp.hbm.xml
<
?xml version='1.0' encoding='UTF-8'?>
<
!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 5.3//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-5.3.dtd">
<
hibernate-mapping>
<
class name="com.srcmini.Employee" table="em">
<
id name="id">
<
generator class="native">
<
/generator>
<
/id>
<
property name="name">
<
/property>
<
property name="job">
<
/property>
<
property name="salary">
<
/property>
<
/class>
<
query name="findEmployeeByName">
<
![CDATA[from Employee e where e.name = :name]]>
<
/query>
<
/hibernate-mapping>
持久类应该是这样的:
Employee.java
package com.srcmini;
public class Employee {
int id;
String name;
int salary;
String job;
//getters and setters
}
现在, 将映射资源包括在hbm文件中, 如下所示:
hibernate.cfg.xml
<
mapping resource="emp.hbm.xml"/>
推荐阅读
- 使用XML的Hibernate一对多示例
- 使用XML Hibernate多对一映射
- 使用注解Hibernate多对一映射
- 使用XML的Hibernate多对多示例
- 使用注解Hibernate多对多示例
- Hibernate生命周期
- Hibernate配置
- Hibernate和Struts 2集成
- Hibernate和Spring集成