Hibernate之HQL
SQL语句的DML操作不外乎:增,删,改,查
增加 : save(),persist()
删除 : delete()
改动 : update()
查询 : get() ,load()
其中的查询操作,作为最为常用的语句,又可以分为很多种情况。通过get()和load()方式,我们仅仅可以指定类型,和id获得一条记录。
当我们需要根据进行条件查询时来获得多条记录时,就不能再使用get(),和load()方式。
Hibernate提供了很强大的查询体系:HQL查询,条件查询,原生SQL查询
1.HQL查询
HQL(Hibernate Query Language)即Hibernate查询语句。Hibernate的语法很像SQL的语法,也可以说事SQL语句的转化。
我们知道SQL语言的操作对象是数据表,列等数据库对象,而HQL语句则是把SQL语句中的数据表替换为持久化类,列替换为属性。
这样HQL就变成了面向对象的查询语言,它可以支持继承,多态等特性。
HQL查询 主要依赖的是Query类,每个Query类的实例对应一个查询对象。Query类的实例对象可以通过session.createQuery(Sting Hql)来获得。最基本的例子如下:
@Test
public void testHQL(){ String hql = "select p.name , p.age from Person p where id = 99"; // HQL语句,name,age,id是Person类实例对象p的属性 Query query = session.createQuery(hql); //获得查询对象
Person p = (Person) query.uniqueResult(); //明确知道查询得到的记录只有一条,用uniqueResult()方法 System.out.println("查询得到的对象是:"+ p);
}
为HQL语句绑定参数:
上面的例子中id=99是静态写死在HQL语句中,但是实际的开发中,常常是根据传进来的参数来查询,静态写死就不灵活了。有两种方法文HQL绑定参数:
第一种:使用 ? 占位符
两点注意:?占位符的索引从1开始,根据属性的类型来选择setXxxx()方法。
@Test
public void testHQL(){ String hql = "select p.name , p.age from Person p where p.id = ? and p.birthday = ?"; // HQL语句,name,age,id,birthday是Person类实例对象p的属性 Query query = session.createQuery(hql); //获得查询对象 query.setInteger(1,99);
query.setDate(2,new Date())
Person p = (Person) query.uniqueResult(); //明确知道查询得到的记录只有一条,用uniqueResult()方法 System.out.println("查询得到的对象是:"+ p);
}
第二种:命名参数进行绑定
格式为 :参数名 设值时根据参数名 进行设值
@Test
public void testHQL(){ String hql = "select p.name , p.age from Person p where p.id = :id and p.birthday = :birthday"; // HQL语句,name,age,id,birthday是Person类实例对象p的属性 Query query = session.createQuery(hql); //获得查询对象 query.setInteger("id",99);
query.setDate("birthday",new Date())
Person p = (Person) query.uniqueResult(); //明确知道查询得到的记录只有一条,用uniqueResult()方法 System.out.println("查询得到的对象是:"+ p);
}
得到查询结果集:
如果 查询的结果是唯一的一条记录,可以调用uniqueResult(); 但是当查询的结果是多条记录时,可以使用两个方法来遍历每条记录:
list()方法
@Test
public void testHQL(){ String hql = "select p.name , p.age from Person p where p.birthday > :birthday"; // HQL语句,name,age,id,birthday是Person类实例对象p的属性 Query query = session.createQuery(hql); //获得查询对象 query.setDate("birthday",new Date())
List<Person> list = query.list(); //将查询后的结果转化为list集合
for(Person p : list) //遍历list集合
{
System.out.println("Person实例对象--" + p);
}
}
iterate()方法
@Test
public void testHQL(){ String hql = "select p.name , p.age from Person p where p.birthday > :birthday"; // HQL语句,name,age,id,birthday是Person类实例对象p的属性 Query query = session.createQuery(hql); //获得查询对象 query.setDate("birthday",new Date())
Iterator<Person> iterator = query.iterate(); ////将查询后的结果转化为list集合,然后拿到迭代器对象
while(iterator.hasNext())
{
Person p = iterator.next()
System.out.println("Person-----" + p);
}
}
这两个方法之间的区别是:
list()方式是立即查询 即会立刻发送一条SQL语句将查询的结果集封装在list集合中 ; list()方法支持一级缓存(session缓存)的写入 不支持读出(就是无论如何都会发SQL语句去查)
iterate()方法是延迟查询 当需要使用某一条查询结果记录时,才发送一条SQL语句,取得这条查询记录 ; iterate()方法支持一级缓存(session缓存)的写入 支持读出(先看缓存有没有,有就不发SQL,没有再发SQL)
根据上面的HQL语句 可知,SQL语句是按照一条记录一条记录这样的形式来查,HQL语句是按照一个实例对象一个实例对象这样的形式来查。
由于HQL语句中不允许出现*号 所以 select * from tb_person的对应HQL可以写为 select p.id ,p.name,p.age from Person p ;(列举出所有实例对象p的属性)
也可以简写为 from Person p;
HQL语句还可以结合 where子句做更为复杂的查询 ,其语法格式类似于SQL语句。
HQL语句也可以做增加,删除,更新的DML操作。 这些操作都涉及到SQL相关知识,这里不再详细叙述。
命名HQL查询:
命名HQL查询 的本质就是把 HQL语句从java代码中取出来,放到配置文件中进行管理,并为这条HQL语句起一个名字,以便在java代码中获取这条HQL语句。
hql.xml配置文件 (名字随意)
<query name="query1">
select p.id , p.name from Person p;
</query>
还需要在hibernate.cfg.xml配置文件中引入hql.xml配置文件
<mapping resource="org/fkjava/test/hql.xml"/>
java代码:
@Test
public void testHQL(){ Query query = session.getNamedQuery("query1"); //根据hql名称 ,加载hql语句,得到query对象 List<Person> list = query.list(); //得到查询结果集的list集合
}
Hibernate之HQL的更多相关文章
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate学习-Hibernate查询语言HQL
HQL(Hibernate Query Language)Hibernate查询语言,语法类似于SQL,可以直接使用实体类及属性. 使用HQL 可以避免使用JDBC 查询的一些弊端 不需要再编写繁复的 ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate之HQL介绍
Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
- Hibernate 的hql查询简介【申明:来源于网络】
Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...
- Hibernate的hql语句save,update方法不执行
Hibernate的hql语句save,update方法不执行 可能出现的原因问题: 未进行事务管理 需要进行xml事务配置或者注解方式的事务配置
- Hibernate学习---第九节:Hibernate之hql
一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; impor ...
- Java_Web三大框架之Hibernate+jsp+HQL分页查询
分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { ...
- Hibernate之HQL查询的一些例子
Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承 ...
随机推荐
- 【BZOJ4372】烁烁的游戏(动态点分治)
[BZOJ4372]烁烁的游戏(动态点分治) 题面 BZOJ 大意: 每次在一棵书上进行操作 1.将离某个点u的距离不超过d的点的权值加上w 2.询问单点权值 题解 这题和前面那一道震波几乎是一模一样 ...
- webpack3中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
1.在webpack中需要处理css必须先安装如下两个loader npm install --save-dev css-loader style-loader 2.要处理sass和添加浏览器前缀需要 ...
- Oracle定时任务小案例
需求简述 一个数据表中包含此数据的录入时间,此数据的初始状态是有效,五天后系统自动置该数据的状态为无效. 方案 写一个存储过程,用于更新字段(改状态): 写一个job,用于定时执行存储过程: 方案逻辑 ...
- c++面试遇到问题
1. C 和 C++ 区别 2. const 有什么用途 主要有三点: 1:定义只读变量,即常量 2:修饰函数的参数和函数的返回值 3: 修饰函数的定义体,这里的函数为类的成员函数, ...
- python—day02
python的版本与基本类型... 第一: 讲了计算机的基础的补充,讲解了什么是操作系统,计算机硬件,应用程序之间的关系: 操作系统是一个能协调管理计算机软件与硬件的软件程序: 能帮我们发送指令集到C ...
- Problem : 1412 ( {A} + {B} )
//集合中元素是不会重复的,所以完全没有必要将两个集合合并后再进行排序,交换排序的时间效率是O(n^2),将两个集合中的元素分别排序后输出即可.输出格式也非常需要 //注意的.输出一列元素赢以cout ...
- WordPress让文本小工具支持简码
WordPress 的 “文本” 小工具是非常常用的,可以添加一些自定义的文本或者 Html 代码.但很多时候,我们需要在文本小工具里使用简码来添加一些更加丰富的内容. 默认情况下,文本小工具是不支持 ...
- APIcloud 移动端常用事件
1.监听按键事件 返回键 api.addEventListener({ name:'keyback' }, function(ret, err){ if( ret ){ alert( JSON.str ...
- .Net小白的大学四年,内含面经
大家好 我是码农阿宇,和博客园的广大兄弟一样,我们都喜欢.Net,但是你们是985/211,而我江西一所普通得不能再普通的二本大学---九江学院,大四毕业在即,英语四级未过(为什么强调这一点?见文末- ...
- MySQL 中添加列、修改列以及删除列
ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:); 删除列:alte ...