打开Hibernate的Session的源码,我们可以看到有一个getNamedQuery(String name);的方法,如下:

/*** Obtain an instance of <tt>Query</tt> for a named query string defined in the* mapping file.** @param queryName the name of a query defined externally* @return Query* @throws HibernateException*/public Query getNamedQuery(String queryName) throws HibernateException;

这个方法就是可以执行定义在Hibernate实体类映射文件中的HQL或Sql语句。

具体做法下面我一一讲解,首先测试在映射文件中定义HQL语句。

我在User实体类的映射文件中定义了一个name为getUserByName的HQL查询语句,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xigua.domain"><class name="User"><id name="id"><generator class="native"/></id><property name="name"/><property name="birthday"/></class><!-- 定义一个查询,名称为getUserByName --><query name="getUserByName"><![CDATA[from User where name = :name]]></query>
</hibernate-mapping>

然后编写测试类使用Session中的getNamedQuery(String name)方法进行测试,代码如下:

package com.xigua.test;import java.util.Date;
import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;import com.xigua.domain.User;
import com.xigua.utils.HibernateUtil;public class Test9 {public static void main(String[] args) {addUser();String name = "xigua";List<User> list = namedQuery(name);if(list != null && !list.isEmpty()) {for(User user : list) {System.out.println(user.getId() + ", " + user.getName() + ", " + user.getBirthday());}}}public static void addUser() {Session session = null;Transaction tx = null;try{session = HibernateUtil.getSession();tx = session.beginTransaction();User user = new User();user.setName("xigua");user.setBirthday(new Date());session.save(user);user = new User();user.setName("donggua");user.setBirthday(new Date());session.save(user);tx.commit();} catch(Exception e) {if(tx != null) {tx.rollback();}} finally {if(session != null) {session.close();}}}public static List<User> namedQuery(String name) {Session session = null;try{session = HibernateUtil.getSession();Query query = session.getNamedQuery("getUserByName");query.setParameter("name", name);return query.list();}catch(Exception e) {e.printStackTrace();} finally {if(session != null) {session.close();}}return null;}}

注意红色部分代码。

在映射文件中除了可以定义HQL语句,也还是可以定义Sql语句的。

前面的User实体类的映射文件修改如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xigua.domain"><class name="User"><id name="id"><generator class="native"/></id><property name="name"/><property name="birthday"/></class><!-- 定义一个查询,名称为getUserByName <query name="getUserByName"><![CDATA[from User where name = :name]]></query>--><sql-query name="getUserByName"><![CDATA[select id, name from user where name = :name]]></sql-query>
</hibernate-mapping>

测试代码如下:

package com.xigua.test;import java.util.Date;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;import com.xigua.domain.User;
import com.xigua.utils.HibernateUtil;public class Test10 {public static void main(String args[]) {addUser();String name = "xigua";User user = namedSqlQuery(name);if(user != null) {System.out.println(user.getId() + ", " + user.getName());}}public static void addUser() {Session session = null;Transaction tx = null;try{session = HibernateUtil.getSession();tx = session.beginTransaction();User user = new User();user.setName("xigua");user.setBirthday(new Date());session.save(user);user = new User();user.setName("donggua");user.setBirthday(new Date());session.save(user);tx.commit();} catch(Exception e) {if(tx != null) {tx.rollback();}} finally {if(session != null) {session.close();}}}public static User namedSqlQuery(String name) {Session session = null;try{session = HibernateUtil.getSession();Query query = session.getNamedQuery("getUserByName");query.setParameter("name", name);Object[] obj = (Object[]) query.uniqueResult();if(obj != null) {User user = new User();user.setId(Long.valueOf(obj[0].toString()));user.setName(obj[1].toString());return user;}}catch(Exception e) {e.printStackTrace();} finally {if(session != null) {session.close();}}return null;}}

映射文件中还有些其它的配置,暂时还没具体搞懂,比如下面红色的代码:

<sql-query name="getUserByName"><![CDATA[select id, name from user where name = :name]]><query-param name="name" type="string"/><return></return><return-join alias="" property=""></return-join><return-scalar column=""/><synchronize table=""/></sql-query>

还有一点像说明的是<query>跟<sql-query>的配置是可以放到<class>节点里面的。

我现在是放在<class>节点外面,表示全局可用,这里需要注意不要跟其它映射文件中定义的<query>或<sql-query>同名。

如果将<query>或<sql-query>放在<class>节点里面,在java代码中使用的时候需要将package名跟class名都写上,具体见下面配置的映射文件代码跟测试代码。

映射文件代码:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xigua.domain"><class name="User"><id name="id"><generator class="native"/></id><property name="name"/><property name="birthday"/><!-- 定义一个查询,名称为getUserByName (这里将<query>放到<class>节点里面来)--> <query name="getUserByName"><![CDATA[from User where name = :name]]></query></class></hibernate-mapping>

java测试代码(注意下图红色部分字符串)

package com.xigua.test;import java.util.Date;
import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;import com.xigua.domain.User;
import com.xigua.utils.HibernateUtil;public class Test9 {public static void main(String[] args) {addUser();String name = "xigua";List<User> list = namedQuery(name);if(list != null && !list.isEmpty()) {for(User user : list) {System.out.println(user.getId() + ", " + user.getName() + ", " + user.getBirthday());}}}public static void addUser() {Session session = null;Transaction tx = null;try{session = HibernateUtil.getSession();tx = session.beginTransaction();User user = new User();user.setName("xigua");user.setBirthday(new Date());session.save(user);user = new User();user.setName("donggua");user.setBirthday(new Date());session.save(user);tx.commit();} catch(Exception e) {if(tx != null) {tx.rollback();}} finally {if(session != null) {session.close();}}}public static List<User> namedQuery(String name) {Session session = null;try{session = HibernateUtil.getSession();Query query = session.getNamedQuery("com.xigua.domain.User.getUserByName");query.setParameter("name", name);return query.list();}catch(Exception e) {e.printStackTrace();} finally {if(session != null) {session.close();}}return null;}}

转载于:https://www.cnblogs.com/limengtr/p/4074594.html

Hibernate的命名查询(NamedQuery)相关推荐

  1. (2)hibernate HQL命名查询和Query接口的分页查询

    一  hql命名查询 hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的 ...

  2. Hibernate命名查询示例 - @NamedQuery

    Hibernate命名查询示例 - @NamedQuery 欢迎使用Hibernate命名查询示例教程.我们看到了如何在Hibernate中使用HQL和Native SQL Query.如果有很多查询 ...

  3. (9) ebj学习: Jpa的增删查改,CURD方法监听和命名查询

    1 整体结构 client文件存放 ejb客户端的一些jar包 Animal.java 中配置命名查询 Person.java 中实现了方法监听和类监听两种监听方式( 在增删查改方法执行之前后之后调用 ...

  4. Hibernate-ORM:14.Hibernate中的命名查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编 ...

  5. Hibernate(九)HQL查询

    一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

  6. jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询

    jpa命名 多条件查询命名 JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将 ...

  7. JPA 2 | 动态查询与命名查询

    JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将对定义的Entity类执行C ...

  8. Hibernate Query数据查询

    2019独角兽企业重金招聘Python工程师标准>>> 主要由三种查询:HQL查询.Criteria条件查询.SQL查询. 以下分别讲解 1. HQL查询 HQL(Hibernate ...

  9. hql连接查询及外置命名查询

    一.连接查询 在sql中经常使用连接查询来获取多个对象的合集,其中经常用到的有inner join.left join.right join等,分别指代内连接查询.左外连接查询.右外连接查询,它们在查 ...

最新文章

  1. P1903 [国家集训队]数颜色 / 维护队列
  2. 2009年网页设计10大趋势
  3. axios 最全 请求拦截器 响应拦截器 配置公共请求头 超时时间 以及get delete post put 四种请求传参方式
  4. python装饰器class_PYTHON里的装饰器能装饰类吗
  5. ChemDraw是这样预测诺氟沙星NMR谱
  6. 计算机应用技术课程本科,《计算机应用技术I》课程教学大纲(共本科29级用)().doc...
  7. python源码中的学习笔记_第5章_字典
  8. JavaSE学习--正则表达式
  9. JBuilder 2005 Enterprise注册破解
  10. 如何在Excel 2007中创建数据透视表
  11. MATLAB遗传算法求函数最值
  12. python装饰器详解
  13. php 三消算法,三消游戏关卡设计教程(初级篇)——基本地形设计
  14. PRML读书笔记 第十一章 采样方法(1)
  15. git的使用简介 常用命令
  16. 1021 Deepest Root(dfs,图的联通子集个数,树的深度)
  17. 3D模型欣赏:白发小恶魔女 次世代角色设计 毛发细腻
  18. 制作仅在xy方向有周期性的夹层结构,且不使用约束平板
  19. Centos7安装docker并更改阿里云下载镜像地址(附带windows10安装docker教程)
  20. Excel按不同的字体颜色对数据区域分类汇总求和

热门文章

  1. startos 5.1 如何 root 登陆
  2. 第29节 专业英语1
  3. 复用的具体实现方式组合与继承的特点
  4. POJ2528 计算可见线段(线段树)
  5. 粉丝该从哪里来?搞定这8种吸粉渠道
  6. 软件测试--测试Demo
  7. js获取本月第几周和本年第几周
  8. ecmall数据库表详解 二次开发必备
  9. 领航的公开课 有空可以看看
  10. phpmyadmin 安装