Hibernate命名查询是一种通过有意义的名称来使用任何查询的方法。它类似于使用别名。Hibernate框架提供了命名查询的概念,使得应用程序员不必将查询分散在所有Java代码中。

有两种在Hibernate中定义命名查询的方法:

  • 通过注解
  • 通过映射文件

通过注解的Hibernate命名查询

如果要在Hibernate中使用命名查询,需要了解 @NamedQueries 和 @NamedQuery 注解。

@NamedQueries 注解用于定义多个命名查询。

@NamedQuery 注解用于定义单个命名查询。

让我们来看一个使用命名查询的例子:

@NamedQueries(
  {
    @NamedQuery(
    name = "findEmployeeByName",
    query = "from Employee e where e.name = :name"
    )
  }
)

通过注解的Hibernate命名查询示例

在这个例子中,我们使用注解在持久类中定义命名查询。仅有三个文件:

  • Employee.java
  • hibernate.cfg.xml
  • FetchDemo.java

在这个例子中,我们假设数据库中有一个名为em的表,包含4列:id、name、job和salary,并且该表中有一些记录。

Employee.java

这是一个使用注解定义命名查询并将该类标记为实体的持久类。

package cn.javatiku;

import javax.persistence.*;

@NamedQueries(
  {
    @NamedQuery(
    name = "findEmployeeByName",
    query = "from Employee e where e.name = :name"
    )
  }
)

@Entity
@Table(name="em")
public class Employee {
  
  @Override
  public String toString() {
    return id + " " + name + " " + salary + " " + job;
  }

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
  private String name;
  private int salary;
  private String job;
  
  // 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="cn.javatiku.Employee"/> 
  </session-factory> 
</hibernate-configuration>

FetchData.java

这是一个使用命名查询并根据查询打印信息的Java类。getNamedQuery 方法使用命名查询并返回Query实例。

package cn.javatiku;

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="cn.javatiku.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 cn.javatiku;

public class Employee {
  private int id;
  private String name;
  private int salary;
  private String job;
  
  // getters and setters
}

现在在hibernate.cfg.xml中包含hbm文件的映射资源:

hibernate.cfg.xml

<hibernate-configuration>
  <session-factory>
    ...
    <mapping resource="emp.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

以上示例展示了如何通过注解和映射文件来定义和使用Hibernate命名查询。命名查询使得查询管理更为集中和高效。

标签: Hibernate, Hibernate教程, Hibernate框架, Hibernate框架设计, Hibernate初级教程, Hibernate框架用法, Hibernate指南, Hibernate入门, Hibernate中级教程, Hibernate进阶教程, Hibernate高级教程, Hibernate下载