Hibernate(30)Hibernate的Named Query是什么?

Hibernate的Named Query

Named Query(命名查询)是Hibernate提供的一种机制,允许开发者在实体类或映射文件中定义静态的SQL或HQL查询。命名查询的好处包括:

  • 代码复用:可以在多个地方使用相同的查询。
  • 预编译:命名查询在应用启动时被预编译,运行时性能更好。
  • 可维护性:查询逻辑分离,便于维护和管理。

定义Named Query

Named Query可以使用注解或XML配置来定义:

  1. 注解方式
    • 使用@NamedQuery@NamedQueries注解。
  2. XML配置方式
    • 在Hibernate的映射文件中使用<query>标签。

示例代码

使用注解定义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详细解释

  1. 注解方式定义Named Query :在Person实体类上使用@NamedQuery@NamedQueries注解定义查询。

    java 复制代码
    @NamedQueries({
        @NamedQuery(
            name = "Person.findByName",
            query = "FROM Person WHERE name = :name"
        ),
        @NamedQuery(
            name = "Person.findAll",
            query = "FROM Person"
        )
    })
  2. 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>
  3. HibernateUtil类:创建并管理SessionFactory。

    java 复制代码
    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;
        }
    }
  4. 使用Named Query示例:演示如何使用Named Query进行查询。

    java 复制代码
    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();
                }
            }
        }
相关推荐
加油乐15 小时前
react路由配置相关
前端·react.js·ant design
Hi_kenyon15 小时前
VUE3套用组件库快速开发(以Element Plus为例)三
前端·javascript·vue.js
AC赳赳老秦15 小时前
Shell 脚本批量生成:DeepSeek 辅助编写服务器运维自动化指令
运维·服务器·前端·vue.js·数据分析·自动化·deepseek
Anarkh_Lee15 小时前
别再手写 conf 了!NgxFlow:基于 React Flow 的 Nginx 可视化与调试神器
前端·nginx·数据可视化
程序员Agions16 小时前
程序员邪修手册:那些不能写进文档的骚操作
前端·后端·代码规范
jqq66616 小时前
解析ElementPlus打包源码(五、copyFiles)
前端·javascript·vue.js
Awu122716 小时前
⚡IndexedDB:现代Web应用的高性能本地数据库解决方案
前端·indexeddb
似水流年_zyh16 小时前
canvas写一个选择音频区域的组件
前端·canvas
学Linux的语莫16 小时前
linux的root目录缓存清理
linux·运维·服务器