Hibernate的命名查询(NamedQuery)
打开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)相关推荐
- (2)hibernate HQL命名查询和Query接口的分页查询
一 hql命名查询 hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的 ...
- Hibernate命名查询示例 - @NamedQuery
Hibernate命名查询示例 - @NamedQuery 欢迎使用Hibernate命名查询示例教程.我们看到了如何在Hibernate中使用HQL和Native SQL Query.如果有很多查询 ...
- (9) ebj学习: Jpa的增删查改,CURD方法监听和命名查询
1 整体结构 client文件存放 ejb客户端的一些jar包 Animal.java 中配置命名查询 Person.java 中实现了方法监听和类监听两种监听方式( 在增删查改方法执行之前后之后调用 ...
- Hibernate-ORM:14.Hibernate中的命名查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编 ...
- Hibernate(九)HQL查询
一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...
- jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询
jpa命名 多条件查询命名 JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将 ...
- JPA 2 | 动态查询与命名查询
JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将对定义的Entity类执行C ...
- Hibernate Query数据查询
2019独角兽企业重金招聘Python工程师标准>>> 主要由三种查询:HQL查询.Criteria条件查询.SQL查询. 以下分别讲解 1. HQL查询 HQL(Hibernate ...
- hql连接查询及外置命名查询
一.连接查询 在sql中经常使用连接查询来获取多个对象的合集,其中经常用到的有inner join.left join.right join等,分别指代内连接查询.左外连接查询.右外连接查询,它们在查 ...
最新文章
- P1903 [国家集训队]数颜色 / 维护队列
- 2009年网页设计10大趋势
- axios 最全 请求拦截器 响应拦截器 配置公共请求头 超时时间 以及get delete post put 四种请求传参方式
- python装饰器class_PYTHON里的装饰器能装饰类吗
- ChemDraw是这样预测诺氟沙星NMR谱
- 计算机应用技术课程本科,《计算机应用技术I》课程教学大纲(共本科29级用)().doc...
- python源码中的学习笔记_第5章_字典
- JavaSE学习--正则表达式
- JBuilder 2005 Enterprise注册破解
- 如何在Excel 2007中创建数据透视表
- MATLAB遗传算法求函数最值
- python装饰器详解
- php 三消算法,三消游戏关卡设计教程(初级篇)——基本地形设计
- PRML读书笔记 第十一章 采样方法(1)
- git的使用简介 常用命令
- 1021 Deepest Root(dfs,图的联通子集个数,树的深度)
- 3D模型欣赏:白发小恶魔女 次世代角色设计 毛发细腻
- 制作仅在xy方向有周期性的夹层结构,且不使用约束平板
- Centos7安装docker并更改阿里云下载镜像地址(附带windows10安装docker教程)
- Excel按不同的字体颜色对数据区域分类汇总求和