HQL查询语法
前言
Hibernate框架中独有的查询语法HQL(Hibernate Query Language),是一种面向对象的查询语言,其中没有表和字段的概念。只有类、对象和属性的概念。
编写HQL语句
HQL语句中映射的查询名称首先对应的是Java类中的属性名。其次是数据库中的字段名。
from子句
Hibernate中最简单的HQL语句形式:
(1)from cn.hibernatedemo.entity.Dept
(2)from Dept as dept
(3)from Dept dept
select子句
select子句用于选取对象和属性:
(1)select dept.deptName from Dept as dept
(2)select dept from Dept as dept
where子句
where子句用于表达查询的限制条件:from Dept where deptName = ‘SALES’
使用表达式
表达式一般用在where子句中。以下两个HQL语句在where子句中分别使用了lower()函数和year()函数
from Dept dept where lower(dept.deptName) = ‘sales’ :这条HQL语句用于查询名称sales的部门不区分大小写。
from Emp where year(hireDate) = 1980 :用于查询1980入职的员工
order by子句
form Emp order by hirDate asc
from Emp order by hireDate salay desc
执行HQL语句
HQL语句准备好以后,执行HQL语句需使用代码构建Query对象
//定义HQL语句
String hql = "from Emp";
//构建Query对象
Query query = session.createQuery(hql);
Query对象构建好后,两种方式执行查询语句并获取查询结果。list()、iterate()
HQL语句中绑定参数
参数绑定形式
按参数位置绑定
Query query = session.createQuery("from Emp where job = ? and salary > ?"); 通过setXXX()方法绑定参数第一个参数下标位置为0; query.setString(0,job); query.setDouble(1,salary);
按参数名称绑定
在HQL语句中可以定义命名参数,命名参数以:开头
Query query = sesison.createQuery("from Emp where job = :empJob and salary > :empSalery"); 通过setXXX()方法的重载绑定通过对应参数名进行绑定 query.setString("empJob",job); query.setDouble("empSalery",salary);
绑定各种类型的参数
1.Query接口提供的绑定不同数据类型参数的方法
setBoolean() setByte() setDouble() setDate() setString() //用于绑定任意参数使用Object类 setParameter()
实现动态查询
在查询条件很多的情况下,传递过多的参数很不方便。可以吧参数封装在对象中,使用Query接口的setProperties()方法为HQL中的命名参数赋值。setProperties()方法会把对象的属性匹配到命名参数上。命名参数名称要与Java对象的属性匹配。
当只需要返回一个值的时候可以使用uniqueResult()方法获取唯一结果
分页和投影
- 实现数据分页查询
Hibernate提供了简便的方法实现分页,即通过使用Query接口的setFirstResult(int firstResult)方法和setMaxResults(int maxResults)方法实现。
Query query = session.createQuery(hql);
query.setFirstResult(firstResult).setMaxResults(maxResults).list();
使用投影查询
有时候数据展示并不需要获取对象的全部属性,而是只需要对象的某个属性,或需要通过表达式、聚合函数等方式得到某些结果、此时可以使用投影查询。投影查询需要使用HQL的select子句。- 每条查询结果仅包含一个结果列
- 每条查询结果包含不止一个结果列
- 将每条查询结果通过构造方法封装成对象