Hibernate学习-Hibernate查询语言HQL
HQL(Hibernate Query Language)Hibernate查询语言,语法类似于SQL,可以直接使用实体类及属性。
使用HQL 可以避免使用JDBC 查询的一些弊端
不需要再编写繁复的SQL 语句,针对实体类及其属性进行查询
查询结果是直接存放在List 中的对象,不需要再次封装
独立于数据库,对不同的数据库根据Hibernate dialect 属性的配置自动生成不同的SQL 语句执行
一、语法:
select/update/delete……] from Entity [where……] [group by……] [having……] [order by……]
其中:蓝色标记的部分为必须书写的
二、基础查询
1) HQL语法类似于SQL,有SQL的关键词select、from、order by、count()、where等。
2) 不同的是HQL是一种完全面向对象的语言,能够直接查询实体类及属性
3)HQL语法类似于SQL,是一种select ... from结构。其中,from后跟的是实体类名,而不是表名。select后面跟的可以是实体对象,也可以是实体对象的属性或者其他的值。如:
Query query = session.createQuery("select c from Cat as c"); //查询所有的Cat List<Cat> catList = query.list(); //执行查询,返回List其中Cat为实体类Cat,c为Cat对象,关键词as用法同SQL,可以省略。Query是Hibernate的查询对象,query.list()将以List类型返回查询结果,上面代码也可以简写为:
Query query = session.createQuery("from Cat"); //查询所有的Cat List<Cat> catList = query.list(); //执行查询,返回List
三、返回类型
Hiberante使用Query对象进行查询。Session的createQuery()方法能够创建Query实例,参数为HQL。Query对象能够返回各种类型的查询结构,例如:long、、String、List<实体类>、List<Map>、POJO等。
【下述为类型】
3.1 返回类型--查询单个对象
Query的unique()返回单个对象。使用unique()获取返回值时,HQL语句查询到的结果最多只能有一个,如果结果多于一个,unique()方法会抛出异常。如果没有,会返回null。这个方法常常用来查询记录总数,因为总会返回一个对象,并且也只有一个。
如:
Query q =session.createQuery("select count(c) from Cat c"); //创建查询对象
Number num = (Number)q.uniqueResult(); //返回单个实例
int count = num.inValue(); //返回数值
3.2 返回类型--返回集合属性
Query的list()方法是最常用的方法。实际上,unique()方法也是在list()方法得到返回数据后执行的。list()总是返回一个java.util.List对象,里面有0个或多个值。list()可以返回实体对象,也可以返回实体对象的某个属性或某些属性。
如:
List<Cat> catList = session.createQuery("select c from Cat c").list(); //返回存储Cat对象的List
List<String> nameList = session.createQuery("select c.name from Cat c").list(); //返回存储猫名字(String类型)的List
List<String[]> nameList=session.createQuery("select c.name, c.mother.name from Cat c").list(); //返回猫名字、猫妈妈名字的字符串数组(String[]类型)的List
List<Cat> motherList = session.createQuery("select c.mother from Cat c"); //返回猫妈妈的List,虽然是Cat的一个属性,但仍然是Cat类型
3.3 同时返回多个对象
Query的list()方法返回java.util.List对象。List中一般存储完整的实体类对象。如select c from Cat c,会将所有的Cat都查询出来,包含Cat类所有即时加载的属性。
对于有些查询,只需要查几个属性就可以了,这时候可以在HQL中指定要返回的部分。查询部分属性时,返回结果仍然是List类型,里面可能是单个的Object,也可能是Object[]数组,还可能是List对象或Map对象。返回什么类型数据,由HQL语句决定。
3.4 同时返回多个对象--返回Object[]数组
查询多个属性时,Hibernate将同时返回多个对象(以Object[]对象类型返回)。返回的数组是放到List<Object[]>中的,得到返回数组需要遍历List对象。
如:
List<Object[]> list = session.createQuery("select c.name,c.mother.name, c.createDate from Cat c").list(); //返回list
for(Object[] row:list){ //遍历第1层的list
for(Object obj:row){ //遍历第2层的数组
System.out.println(""+obj); //输出Object
}
}
3.5 同时返回多个对象--返回List类型
返回结果还可以放到List<List>中。查询时HQL采用“select new List(a,b,c) from ...”的形式。同样需要遍历List来获取返回的List,再遍历返回的List获取查询结果。
如:
List<List> list = session.createQuery("select new List( c.name,c.mother, c.createDate) from Cat c").list(); //关键词List
for(List row:list){ //遍历第1层的list
for(Object obj:row){ //遍历第2层的数组
System.out.println(""+obj); //输出Object
}
}
3.6 同时返回多个对象-- 返回Map类型
更实用的是返回Map类型。Map中将包含查询的列名、值。遍历List<Map>获得Map,从Map中直接取值就可以了,或者遍历Map。
如:
List listMap = session.createQuery("select new Map( c.name as name,c.mother as mother, c.createDate as createDate) from Cat c").list(); //关键词List
for(Map map:(List<Map>)listMap)){ //遍历第1层的list
System.out.println("name:"+map.get("name"));
System.out.println("Mother:"+map.get("mother"));
System.out.println("CreateDate:"+map.get("createDate"));
}
3.7 同时返回多个对象--返回Java实体对象
对于只查询部分属性的查询,返回数组、List、Map时,很方便,但是操作Object[]数组、List、Map等不如操作实体对象方便。实际上查询部分属性时,也可以返回实体对象。HQL中也可以使用构造函数。
如:
List<Cat> catList=session.createQuery("select new Cat(cat.name, cat.createDate) from Cat c").list();
这样使用时,Cat类必须存在 一个public Cat(String name, Date createDate)的构造函数。因为Hibernate是通过该构造函数完成返回值从Object[]数组转化到Cat实体类的。
四、使用MyEclipse创建使用Hibernate应用
1 . 新建数据库,完成相关表的建立,然后并且创建外键,本次案例的外键为:

【附:数据库相关表】


2. 在MyEclipse中选择MyEclipse Database Explorer,与当前数据库建立链接
(由于我的数据库已经建立了,所以我只把信息的截图列出来)
3.在项目中创建Hibernate




4.在MyEclipse Database Explorer创建映射



5.修改相关xml文件

注:删除掉系统建立的TbCat.hbm.xml和TbCatMother.hbm.xml中的catlog,是为了让系统数据库管理数据库信息,而不是让代码管理数据库信息
6.创建测试类
6.1 查询宠物表中的信息
package cn.edu.bzu.test; import java.util.List; import org.hibernate.Query;
import org.hibernate.Session; import cn.edu.bzu.dao.HibernateSessionFactory;
import cn.edu.bzu.entity.TbCat; public class test {
public static void main(String args[]){
Session session=HibernateSessionFactory.getSession(); //通过HibernateSessionFactory得到session对象 Query q=session.createQuery("from TbCat"); //创建查询
List<TbCat> list=q.list(); //得到查询的值,查询的值为一个List集合 for(TbCat cat:list){ //进行数据遍历
System.out.println("Name: "+cat.getName()+",Description: "+cat.getDescription()+"CreateDate: "+cat.getCreateDate()); } }
}
结果:
6.2 查询宠物的妈妈以及其孩子的信息
package cn.edu.bzu.test; import java.util.List;
import java.util.Set; import org.hibernate.Query;
import org.hibernate.Session; import cn.edu.bzu.dao.HibernateSessionFactory;
import cn.edu.bzu.entity.TbCat;
import cn.edu.bzu.entity.TbCatMother; public class TestMother {
public static void main(String args[]){
Session session=HibernateSessionFactory.getSession(); Query q=session.createQuery("from TbCatMother"); List<TbCatMother> list=q.list(); //取得所有母亲的信息 for(TbCatMother mother:list){
System.out.println("The Mother is " +mother.getName());
System.out.println("---------------");
System.out.println(mother.getName()+"'s Child are ");
Set myset=mother.getTbCats(); //返回一个set对象
Object[] array_cat=myset.toArray(); //将set对象转换为数组的形式
for(int i=0;i<array_cat.length;i++){
TbCat tbCat=(TbCat) array_cat[i]; //取得一行的cat数据
System.out.println("Name: "+tbCat.getName()+" Description: "+tbCat.getDescription());
}
} }
}
结果:
7.总结
7.1 创建数据库,建立相关表
7.2 创建web project ,并且在MyEclipse Database Explorer 中建立相关数据库连接
7.3 添加Hibernate,完成相关设计
7.4 在MyEclipse Database Explorer中为相关的表建立映射关系,并修改相关表的xml文件中的属性,本案例修改的catlog属性
7.5 建立相关测试类,测试数据查询等操作
8.相关资料下载
8.1 Hibernate查询语言HQL
Hibernate学习-Hibernate查询语言HQL的更多相关文章
- [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习笔记(十) — HQL查询
一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JO ...
- [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习--hibernate延迟加载原理(动态代理)
在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...
- Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)
在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- hibernate 教程(3)—NHibernate查询语言HQL
NHibernate之旅(3):探索查询之NHibernate查询语言(HQL) 本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select ...
- Hibernate 学习教程
第1课 课程内容. 6 第2课Hibernate UML图. 6 第3课 风格. 7 第4课 资源. 7 第5课 环境准备. 7 第6课 第一个演示样例HibernateHelloWorld 7 第7 ...
- Hibernate 学习笔记 - 2
五.映射一对多关联关系 1. 单向多对一 即 单向 n-1 1)单向 n-1 关联只需从 n 的一端可以访问 1 的一端 ① 域模型: 从 Order 到 Customer 的多对一单向关联需要在Or ...
随机推荐
- CSS3 perspecitve属性
M M .div1 { position: relative; height: 150px; width: 150px; margin: 0px; padding:2px; border: 1px s ...
- java:POI导出excel
POI是一个开源项目,专用于java平台上操作MS OFFICE,企业应用开发中可用它方便导出Excel. 下面是使用示例: 1.maven中先添加依赖项 <dependency> < ...
- Java 基础【11】@注解
1.注解简介 JDK 1.5 中引入的 java.lang.annotation 包提供注解编程支持,可以让类在编译.类加载.运行时被读取,并执行相应的处理. 在 Java EE应用的时候,总是免不了 ...
- WampServer下如何实现多域名配置(虚拟域名配置)
之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心是得新建一个端口,也就是新建一个 http 服务 ...
- SQL基础之数据库
1.基础概念 首先要强调一点,就是我们的数据库是由数据库系统来管理的,我们登入数据库并在其上进行操作时最终均要通过数据库系统来完成.可以理解成在数据库上进行操作的是客户端,数据库系统是服务端.一个数据 ...
- Nodejs进阶:基于express+multer的文件上传
关于作者 程序猿小卡,前腾讯IMWEB团队成员,阿里云栖社区专家博主.欢迎加入 Express前端交流群(197339705). 正在填坑:<Nodejs学习笔记> / <Expre ...
- SDRAM读写一字(下)
SDRAM读写一字 SDRAM控制模块 上电后进行初始化状态,初始化完成后进入空闲状态,在此进行判断如下判断: 如果自刷新时间到,则进行自刷新操作,操作完成后重新进入空闲状态: 如果读使能有效则进行读 ...
- [POJ2404]Jogging Trails(中国旅行商问题)(一般图的匹配——状压DP)
题目:http://poj.org/problem?id=2404 题意:有个n(n<=15)的点和m条无向边,每条边都有自己的权值.现在你要从某个点出发,每条边可以经过多次但要保证每条边至少走 ...
- SNMP 原理与实战详解
原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- 关于cmd下使用taskkill无法终止进程名包含空格的进程的解决方案
在我们使用taskkill命令终止进程时,有时会遇到无法终止含空格的进程的问题.只要在进程名外部加上双引号即可解决此问题. 如图所示: 附上taskkill命令的语法及相关说明: TASKKILL [ ...

