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的更多相关文章

  1. hibernate的hql查询

    1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...

  2. Hibernate学习-Hibernate查询语言HQL

    HQL(Hibernate Query Language)Hibernate查询语言,语法类似于SQL,可以直接使用实体类及属性. 使用HQL 可以避免使用JDBC 查询的一些弊端 不需要再编写繁复的 ...

  3. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...

  4. Hibernate之HQL介绍

    Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL ...

  5. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  6. Hibernate 的hql查询简介【申明:来源于网络】

    Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...

  7. Hibernate的hql语句save,update方法不执行

    Hibernate的hql语句save,update方法不执行 可能出现的原因问题: 未进行事务管理 需要进行xml事务配置或者注解方式的事务配置

  8. Hibernate学习---第九节:Hibernate之hql

    一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; impor ...

  9. Java_Web三大框架之Hibernate+jsp+HQL分页查询

    分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { ...

  10. Hibernate之HQL查询的一些例子

    Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承 ...

随机推荐

  1. 【BZOJ2998】Problem A(动态规划)

    [BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...

  2. 【SPOJ】Substrings(后缀自动机)

    [SPOJ]Substrings(后缀自动机) 题面 Vjudge 题意:给定一个长度为\(len\)的串,求出长度为1~len的子串中,出现最多的出现了多少次 题解 出现次数很好处理,就是\(rig ...

  3. 自言自语WEB前端面试题(二)

    今天换道题,新鲜出炉的 var Model=function(){ this.name='lilei'; this.age=20; } Model.prototype.say=function(){ ...

  4. .NET Core开源API网关 – Ocelot中文文档

    Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...

  5. ubuntu系统备份与恢复(也适用于其他linux系统)

    在windows环境下面,有很多的备份恢复软件,系统也自带了备份恢复功能,比较知名的软件比如ghost等,为什么要备份系统,我之前一直都是系统出现问题就全新安装原版的windows,然后各种设置,各种 ...

  6. 关于Eclipse无法识别手机或者模拟器的解决方案

    Android开发的时候经常会出现eclipse devices中不显示手机或模拟器的情况 网上有很多方法,但是都不实用.这里我提供一种方法: 如果手机连接上了不显示的话首先我们要确定我们手机的驱动是 ...

  7. 元素化设计原理及规则v1.0

    一.元素设计架构 元素设计架构展示在基于元素化设计的思想下,系统各元素之间如何相互协作,并完成整个系统搭建. 架构中以Entity(数据)为中心,由Entity产生数据库表结构,并且Entity作为业 ...

  8. ELK重难点总结和整体优化配置

    本文收录在Linux运维企业架构实战系列 做了几周的测试,踩了无数的坑,总结一下,全是干货,给大家分享~ 一.elk 实用知识点总结 1.编码转换问题(主要就是中文乱码) (1)input 中的cod ...

  9. 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt

    首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 . 这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Ac ...

  10. C语言第十次博客作业--结构体

    一.PTA实验作业 题目1: 结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 求出每名学生的总分 定义i,j循环变量 for i=0 to n for j=0 to 3 p[i].su ...