📜  休眠命名查询示例

📅  最后修改于: 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"
        )
    }
)

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

在此示例中,我们使用注释在持久化类中定义命名查询。只有三个文件:

  • Employee.java
  • hibernate.cfg.xml
  • 提取演示

在此示例中,我们假设数据库中有一个em表,其中包含4列ID,名称,工作和薪水,并且该表中有一些记录。

Employee.java

它是一个持久类,使用注释来定义命名查询并将该类标记为实体。


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
}

hibernate.cfg.xml

它是一个配置文件,用于存储有关数据库的信息,例如驱动程序类,URL,用户名,密码和映射类等。







    
        update
        org.hibernate.dialect.Oracle9Dialect
        jdbc:oracle:thin:@localhost:1521:xe
        system
        jtp
        oracle.jdbc.driver.OracleDriver
    
    



FetchData.java

这是一个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命名查询

如果要通过映射文件定义命名查询,则需要使用hibernate-mapping的query元素来定义命名查询。

在这种情况下,您需要创建定义命名查询的hbm文件。其他资源与上面的示例相同,除了持久类Employee.java(不需要使用任何批注)和hibernate.cfg.xml文件(需要指定hbm文件的映射资源)之外。

hbm文件应如下所示:

emp.hbm.xml

















 

持久类应如下所示:

Employee.java

package com.javatpoint;
public class Employee {
    int id;
    String name;
    int salary;
    String job;
    //getters and setters
}

现在,将映射资源包括在hbm文件中,如下所示:

hibernate.cfg.xml