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建立持久化类之间的多对多关联关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值