HQL连接查询和注解
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 |
适用范围: 适用于有关联关系的持久化类,并且在映射文件中对这种关联关系做了映射的.
迫切连接: 是指不仅指定了连接的查询方式,而且显示地指定了关联级别的查询策略.迫切连接使用 fetch 关键字,fetch关键字表明 “左边” 对象用来与 “右边” 对象关联的属性会立即被初始化.
代码演示:
这里就拿 迫切内连接作为演示
from Dept d inner join fetch d.emps
结果: 返回 List
普通连接:(不是迫切的连接) 返回的集合都会被Hibernate封装成 List< Object[ ] >
代码演示:
这里就拿 内连接作为演示
from Dept d inner join d.emps //连接的是关联属性 不是实体类 这个得注意下
结果: 返回 List< Object[ ] >
结论: 普通连接 和 迫切连接 的区别就在于对结果的封装.等值连接
等值连接: HQL支持SQL风格的等值连接查询.等值连接适用于两个类之间 没有定义任何关联时 ,如统计报表数据.在where子句中,通过属性作为筛选条件.
代码如下:
相当于普通的内连接的查询结果
from Dept d, Emp e where d = e.dept
隐式内连接: Hibernate会根据关联关系自动使用等值连接(等效于内连接)查询.允许以更加面向对象的方式编写HQL语句,更多地依据对象间的关系,而不必考虑数据库结构.
查询 某部门的雇员
代码:
from Emp e where e.dept.dname='SALES' //更加面向对象的方式
select e.ename, e.dept.dname from Emp e //查询
子查询
关键字 | 说明 |
---|---|
all | 子查询语句返回的所有记录 |
any | 子查询语句返回的任意一条记录 |
some | 与 “any” 意思相同 |
in | 与"=any"意思相同 |
exists | 子查询语句至少返回一条记录 |
HQL操作集合的函数或属性
函数或属性 | 说明 |
---|---|
size()或size | 获取集合中元素的数目 |
minIndex()或minIndex | 对于建立了索引的集合,获得最小的索引 |
maxIndex()或maxIndex | 对于建立了索引的集合,获得最大的索引 |
minElement()或minElement | 对于包含基本类型元素的集合,获得集合中取值最小的元素 |
maxElement()或maxElement | 对于包含基本类型元素的集合,获得集合中取值最大的元素 |
elements | 获取集合中的所有元素 |
作用: 为了简化查询语句
代码演示:
from Dept d where 1000< all(select e.sal from d.emps e) and size(d.emps)>0 //此处的size()直接过滤掉部门成员为0的
//查询 员工人数大于3的部门
from Dept d where d.emps.size>3 //属性的方式
Hibernate查询性能优化
Hibernate查询优化策略
- 使用延迟加载等方式避免加载多余数据.
- 通过使用连接查询,配置二级缓存、查询缓存等方式减少select语句数目.
- 结合缓存机制,使用iterate()方法减少查询字段数及数据库访问次数(对比list()方法和iterate()方法)
HQL优化
- 注意避免or、not 、like使用不当导致的索引失效
- 注意避免having子句、distinct导致的开销
- 注意避免对索引字段使用函数或进行计算导致的索引失效
Hibernate注解
代替 hbm.xml文件完成对象-关系映射
使用步骤如下:
(1) 使用注解配置持久化类及对象关联关系
(2) 在Hibernate配置文件(hibernate.cfg.xml)中声明持久化类
语法: < mapping class=“持久化类完全限定名” >
注解 | 含义和作用 |
---|---|
@Entity | 将一个类声明为持久化类 |
@Table | 为持久化类映射指定表 |
@Id | 声明了持久化类的标识属性(相当于数据库表的主键列) |
@GeneratedValue | 定义标识属性值的生成策略 |
@SequenceGennerator | 定义序列生产器 |
@Column | 将属性映射到数据库字段 |
@Transient | 指定可以忽略的属性,不用持久化到数据库 |
使用注解配置关联关系
注解 | 含义和作用 |
---|---|
@OneToOne | 建立持久化类之间的一对一关联关系 |
@OneToMany | 建立持久化类之间的一对多关联关系 |
@ManyToOne | 建立持久化类之间的多对一关联关系 |
@ManyToMany | 建立持久化类之间的多对多关联关系 |