HQL的使用

sky-mxc 总结 转载注明:https://sky-mxc.github.io

HQL

Hibernate 支持三种查询方式

  1. HQL
  2. SQL
  3. Criteria查询

HQL是一种面向对象的查询语言,没有表和字段的概念,只有对象和属性的概念,是完全的面向对象的,它可以理解继承,多态,和关联之类的概念。
HQL语句中除了java的类和属性的名之外,查询语句不区分大小写的,例如 :’select,Where’之类的查询语句

HQL的子句

from子句

1
2
3
from Employee
# 指定别名
from Employee as emp

select 子句

select子句用于选取对象和属性

1
2
3
select id,name from Employee
# 别名
select emp.id,emp.name from Employee emp

where 子句

where 子句用于表达查询的限制条件

1
from Employee Where age > 20

表达式

1
2
3
4
# lower() 将字母转换为小写
from Employee where lower(name) = 'mxc'
# year()获取日期的年份
from Employee where year(data) >1997

order by

order by 子句用来指定属性的排序

默认 的是 asc 升序排序 ;desc:降序排序

1
from Employee emp order by emp.age desc

绑定参数

  1. 按参数位置绑定
  2. 按照参数名字绑定

按照位置绑定

使用 “?” 来进行占位,定义参数的位置,然后通过 query的 setXXXX()来绑定参数

1
2
# 使用 ? 进行占位
from Employee where age > ? and name like name like ?
1
2
query.setInteger(0, 20);
query.setString(1, "sky");

按照名字进行绑定

在HQL查询语言中定义命名参数,命名参数通过以“:”开头

1
from Employee where age > :age

名字绑定和位置绑定对比

  1. 名字绑定具有较好的可读性
  2. 易于代码的维护,对位置绑定的参数,一旦位置发生改变就要修改绑定参数的代码,比较麻烦。

绑定任意类型的参数

对于不知道的参数类型,可以使用 ‘setParameter()’进行绑定

适用于动态查询

1
query.setParameter("age", 20);

对象查询

将查询参数封装成一个对象或者 放到一个Map集合中 ,直接将对象或者Map集合设置给query对象即可

1
2
3
4
Map<String, Object> params = new HashMap<>();
params.put("age", 20);
params.put("name", "%sky%");
query.setProperties(params);

注意点:

  1. Map中的键 要和HQL中的参数名字一致
  2. 对象中的属性名字要和HQL参数的名子一致
  3. 参数区分大小写

获取 唯一结果

有时候我们只想要获取一个结果 就可以使用 ‘query.getSingleResult()’方法获取唯一结果。例如 只想要获员工的最大年龄

1
2
3
4
# HQL 语句
select max(age) from Employee
#getSingleResult()方法
query.getSingleResult();

分页查询

通过 query的 ‘setFirstResult()’ 和 ‘setMaxResults()’ 设置分页参数

1
2
3
4
5
int pageIndex =2;
int pageSize = 3;
query.setFirstResult((pageIndex -1)*pageSize);
query.setMaxResults(pageSize);
java.util.List<Employee> employees = query.getResultList();

连接查询

hql 支持的连接类型

链接类型 HQL语法
内连接 inner join 或join
迫切内连接 inner join fetch或 join fetch
左外连接 left outer join 或 left join
迫切左外连接 left outer join fetch 或 left join fetch
右外连接 right outer join或right join

迫切连接是指在指定连接方式时不仅指定了连接查询方式,而且显示地指定了关联级别的查询策略,Hibernate 使用fetch 关键字表明 “左边”对象用于与“右边”对象关联的属性会被立即初始化。