Hibernate框架基础知识

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")需要使用类的全限定名称

你可能感兴趣的:(Hibernate框架基础知识)