Hibernate的Named Query
Named Query(命名查询)是Hibernate提供的一种机制,允许开发者在实体类或映射文件中定义静态的SQL或HQL查询。命名查询的好处包括:
- 代码复用:可以在多个地方使用相同的查询。
- 预编译:命名查询在应用启动时被预编译,运行时性能更好。
- 可维护性:查询逻辑分离,便于维护和管理。
定义Named Query
Named Query可以使用注解或XML配置来定义:
- 注解方式 :
- 使用
@NamedQuery和@NamedQueries注解。
- 使用
- XML配置方式 :
- 在Hibernate的映射文件中使用
<query>标签。
- 在Hibernate的映射文件中使用
示例代码
使用注解定义Named Query
实体类 Person
java
package com.example.domain;
import javax.persistence.*;
@Entity
@Table(name = "person")
@NamedQueries({
@NamedQuery(
name = "Person.findByName",
query = "FROM Person WHERE name = :name"
),
@NamedQuery(
name = "Person.findAll",
query = "FROM Person"
)
})
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters 和 Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
使用XML配置定义Named Query
配置文件 Person.hbm.xml
xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.domain.Person" table="person">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
<!-- Named Queries -->
<query name="Person.findByName">
<![CDATA[
FROM Person WHERE name = :name
]]>
</query>
<query name="Person.findAll">
<![CDATA[
FROM Person
]]>
</query>
</hibernate-mapping>
使用Named Query示例
HibernateUtil类
java
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// 从配置文件创建SessionFactory
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
// 记录启动失败的错误
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
查询示例
java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import java.util.List;
public class HibernateNamedQueryExample {
public static void main(String[] args) {
// 获取SessionFactory
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// 插入示例数据
insertSampleData(sessionFactory);
// 使用Named Query查询数据
queryByName(sessionFactory, "John Doe");
queryAll(sessionFactory);
// 关闭SessionFactory
sessionFactory.close();
}
private static void insertSampleData(SessionFactory sessionFactory) {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
Person person1 = new Person("John Doe", 30);
Person person2 = new Person("Jane Doe", 28);
session.save(person1);
session.save(person2);
transaction.commit();
System.out.println("Inserted sample data");
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
private static void queryByName(SessionFactory sessionFactory, String name) {
Session session = sessionFactory.openSession();
try {
Query<Person> query = session.createNamedQuery("Person.findByName", Person.class);
query.setParameter("name", name);
List<Person> persons = query.getResultList();
System.out.println("Query by name (" + name + "):");
for (Person person : persons) {
System.out.println(person.getName() + " - " + person.getAge());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
private static void queryAll(SessionFactory sessionFactory) {
Session session = sessionFactory.openSession();
try {
Query<Person> query = session.createNamedQuery("Person.findAll", Person.class);
List<Person> persons = query.getResultList();
System.out.println("Query all persons:");
for (Person person : persons) {
System.out.println(person.getName() + " - " + person.getAge());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
}
Named Query详细解释
-
注解方式定义Named Query :在
Person实体类上使用@NamedQuery和@NamedQueries注解定义查询。java@NamedQueries({ @NamedQuery( name = "Person.findByName", query = "FROM Person WHERE name = :name" ), @NamedQuery( name = "Person.findAll", query = "FROM Person" ) }) -
XML配置方式定义Named Query :在
Person.hbm.xml中使用<query>标签定义查询。xml<query name="Person.findByName"> <![CDATA[ FROM Person WHERE name = :name ]]> </query> <query name="Person.findAll"> <![CDATA[ FROM Person ]]> </query> -
HibernateUtil类:创建并管理SessionFactory。
javapublic class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // 从配置文件创建SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); } catch (Throwable ex) { // 记录启动失败的错误 System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } -
使用Named Query示例:演示如何使用Named Query进行查询。
javapublic class HibernateNamedQueryExample { public static void main(String[] args) { // 获取SessionFactory SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 插入示例数据 insertSampleData(sessionFactory); // 使用Named Query查询数据 queryByName(sessionFactory, "John Doe"); queryAll(sessionFactory); // 关闭SessionFactory sessionFactory.close(); } private static void insertSampleData(SessionFactory sessionFactory) { Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); try { Person person1 = new Person("John Doe", 30); Person person2 = new Person("Jane Doe", 28); session.save(person1); session.save(person2); transaction.commit(); System.out.println("Inserted sample data"); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } e.printStackTrace(); } finally { if (session != null) { session.close(); } } } private static void queryByName(SessionFactory sessionFactory, String name) { Session session = sessionFactory.openSession(); try { Query<Person> query = session.createNamedQuery("Person.findByName", Person.class); query.setParameter("name", name); List<Person> persons = query.getResultList(); System.out.println("Query by name (" + name + "):"); for (Person person : persons) { System.out.println(person.getName() + " - " + person.getAge()); } } catch (Exception e) { e.printStackTrace(); } finally { if (session != null) { session.close(); } } }