个性化阅读
专注于IT技术分析

Hibernate命名查询

点击下载

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
  • 提取演示

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

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"/>
赞(0)
未经允许不得转载:srcmini » Hibernate命名查询

评论 抢沙发

评论前必须登录!