HQL连接查询和注解

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 建立持久化类之间的多对多关联关系

你可能感兴趣的:(SSH记录)