1. 抓取策略
1.1 类级别检索
当前的类的属性获取是否需要延迟。
get:立即检索。get方法一执行,立即查询所有字段的数据。
load:延迟检索。默认情况,load方法执行后,如果只使用OID的值(查询id)不进行查询,如果要使用其他属性值将查询。(会受到映射文件的配置影响)
get不支持延迟加载,而load支持。
当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。
1.2 关联级别检索
(1)fetch="select"
lazy="true":默认是懒 加载
lazy="false":会立即发送sql名句去查询关联的数据
共同点:
lazy="true" VS lazy ="extra":都是懒加载,只有用到的时候才会去发送sql语句去查询
区别:查询订单数的例子
lazy="true":会发送查询所有数据的sql语句
lazy ="extra":只会发送查询条数的sql语句
(2)fetch="join"
无论lazy属性设置任何值,都不会有效果,它都会用迫切左外连接去查询关联的数据。
fetch="subselect"
lazy="true":默认是懒 加载
lazy="false":会立即发送sql名句去查询关联的数据
共同点:
lazy="true" VS lazy ="extra":都是懒加载,只有用到的时候才会去发送sql语句去查询
区别:查询订单数的例子
lazy="true":会发送查询所有数据的sql语句
lazy ="extra":只会发送查询条数的sql语句
(3)fetch="subselect" VS fetch="select"
例子:查询客户的订单信息
fetch="select" :发送多条select语句去查询
fetch="subselect":只发送一条select语句,子查询的方式。
2. HQL
HQL(Hibernate Query Language)描述对象操作的一种查询语言。
与SQL不同的是,HQL是面向对象的查询,查询的是对象和对象中的属性
注意:HQL中的关键字不区分大小写,但是类名和属性名区分大小写
查询函数:
//获取数据
//获取唯一的值
(1)查询所有:from Teacher
(2)查询单个:select t from Teacher t where t.id = 1
(3)投影:查询部分字段:select t.id,t.name from Teacher t
(4)排序:from Teacher t order by t.id desc/asc(降序/升序)
(5)分页:
//开始位置
query.setFirstResult(0);
//设置一页个数
query.setMaxResults(4);
(6)绑定参数:
方式一:from Teacher t where t.id=?
//与SQL不同,这里是从0开始的
query.setInteger(0,6);
方式二:from Teacher t where t.id=:id
query.setInteger("id",14);
(7)聚合函数:
select count(*) from Teacher
select sum(t.id) from Teacher t
(8)连接查询:
1.交叉查询 (笛卡尔积:就是把A B两张表的所有组合打印出来)
from Teacher t,Classes c
2.隐式内查询
from Father f,Son s where s.father=f
3.显式内查询
from Father f inner join f.sonSet
4.迫切内查询
from Father f inner join fetch f.sonSet
(9)命名查询
1.配置
a)全局:*.hbm.xml HQL语句
b)局部: HQL
2.获得
a)全局:
session.getNamedQuery("queryName")
b)局部:
session.getNamedQuery("className.queryName")需要使用类的全限定名称