Hibernate命名查询

Hibernate命名查询是一种通过有意义的名称使用任何查询的方法。就像使用别名一样。 Hibernate框架提供了命名查询的概念, 因此应用程序程序员无需将查询分散到所有Java代码。
【Hibernate命名查询】有两种方法可以在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"/>

    推荐阅读