hibernate查询语言(Hibernate Query language,HQL),它是Hibernate提供的一种面向对象的查询语言,和SQL查询语言很相似。在Hibervate提供的各种查询方式中,它是使用最广泛的一种,也是官方推荐使用的查询方式,它具有一下功能:
(1)在查询语句中设定各种查询条件。
(2)支持动态绑定参数。
(3)支持投影查询(即仅检索出对象的部分属性)、分页查询、连接查询、分组查询(group by,having),以及子查询。
(4)内置一些聚集函数。
Hibernate中的Query接口就是专门用来执行HQL语句的查询接口,他能够执行各种复杂的HQL查询语句。
1.创建查询对象
在session的对象上调用createQuery()方法可以创建一个HQL查询。代码如下:
Query query=session.createQuery("from Dept");
from Dept 这个字符串就是HQL语句,将创建查询语句之后,就可以执行查询。
2.准备好Query对象后,就可执行那个它并把执行返回的结果获取到内存中。访问结果的方式有以下几种:
1)列出所有结果
调用Query对象的list()方法可以返回所有结果的列表,通过一次循环就可以把整个结果都遍历一遍,这是在实际应用开发最常用的查询方式。
代码:
Query query=session.createQuery("from Dept");//创建查询对象
List<Dept> depts=query.list();//返回所有结果
for(Dept dept:depts){//用forEach循环遍历整个结果列表
}
2)列出单个结果
有时,只需要访问查询返回的单个结果,通过确信查询只会返回一个对象,就可以直接调用Query对象的uniqueResult()方法
代码:
Query query=session.createQuery("from Dept where id=1");
Dept dept=(Dept)query.uniqueResult()
但是如果返回的结果不止一个对象,直接调用uniqueQuery()方法就会抛出异常。这是,需要先调用setmaxResults(1)来明确指定只需要返回一个对象。代码如下:
Query query=session.createQuer("from Dept");
query.setMaxResults(1);
Dept dept=(Dept)query.uniqueResult();
另外说明一点Query接口的选项设置(setXXX)等都会返回Query对象本身。因此Query接口的操作支持方法链方式,上面所示代码可以改成如下代码。
Dept dept=(Dept)Session.createQuery("from Query");
.setMaxResult(1);
.uniqueResult();
这样可以使代码更简洁,更直观。
3)迭代访问结果
Query接口还提供了一个iterate()方法来执行查询,此时Hibernate会再第一个SQL SELECT.语句中只