【05】框架学习—Hibernate中查询详解与查询优化

1. Hibernate的查询方式


1.1 Hibernate的查询方式

唯一标识OID的检索方式:session.get(对象.class, OID)。
        如:A a = session.get(A.class, 1L);

对象的导航的方式。
    如:a.getId();

HQL的检索方式。
    Hibernate Query Language:session.createQuery(String)

QBC的检索方式
    Query By Criteria:session.createCriteria(…)

SQL的检索方式(了解)

1.2 HQL与SQL的关系

HQL查询语句是面向对象的,Hibernate负责解析HQL,然后根据对象-关系映射文件中的映射信息,把HQL查询语句翻译成相应的SQL语句。
HQL查询语句中的主体是域模型中的类及类的属性。
SQL查询语句中的主体是数据库表及表的字段。SQL查询语句是与关系数据库绑定在一起的。

1.3 HQL基本查询演示

1.基本的查询(支持方法链的编程风格):

基本的查询

2.使用别名的方式:

使用别名

3.排序查询:

排序查询

4.分页查询:

分页查询

5.带条件的查询:setParameter()

【05】框架学习—Hibernate中查询详解与查询优化_第1张图片

1.4 HQL的投影查询

投影查询:指的是查询指定的字段。
使用HQL直接投影查询返回的是存储所查询字段的Object[]数组的集合。
例如此时Object[]中两个元素就分别是lkm_name,lkm_gender:

【05】框架学习—Hibernate中查询详解与查询优化_第2张图片

若想正确使用HQL的投影查询,首先在所查询的JavaBean中提供对应的构造函数:

【05】框架学习—Hibernate中查询详解与查询优化_第3张图片

其次,在HQL语句中实例化类即可:

这里写图片描述

1.5 HQL的聚合函数查询

聚合函数:count()、sum()、avg()、max()、min()
这里写图片描述

1.6 QBC的检索方式

Query By Criteria,使用Criteria接口。
1.基本查询方式:

这里写图片描述

2.排序查询:

这里写图片描述

3.分页查询:

这里写图片描述

4.条件查询:
使用Hibernate提供的Restrictions工具类。

【05】框架学习—Hibernate中查询详解与查询优化_第4张图片
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

5.聚合函数查询:
Projection是聚合函数的接口,而Projections是Hibernate提供的工具类。

这里写图片描述

注意,使用聚合函数查询后若想继续查询其它,需要重新设置Projection。
例如要继续查询所有数据:

【05】框架学习—Hibernate中查询详解与查询优化_第5张图片

1.7 离线条件查询

离线条件查询使用的是DetachedCriteria接口进行查询,离线条件查询对象在创建的时候,不需要使用session对象,只是在查询的时候使用session对象即可。

【05】框架学习—Hibernate中查询详解与查询优化_第6张图片

1.8 小结——HQL与QBC对比

【05】框架学习—Hibernate中查询详解与查询优化_第7张图片

1.9 SQL的查询方式(了解)

使用SQLQuery接口。

这里写图片描述

注意,返回值若想是查询的表映射的对象,需要添加实体。

这里写图片描述

补充:HQL多表查询

内连接:inner join。
外连接:left/right join。

HQL的多表查询:
非迫切查询:返回结果是List

这里写图片描述

迫切查询:返回List<对象>。

这里写图片描述

对于外连接查询,只需更改上述例子的hql中的inner为left/right即可。
此外,查询的结果出现重复可通过封装set解决:

这里写图片描述

2.Hibernate的查询优化


2.1 延迟加载

延迟加载是先获取到代理对象,当真正使用到该对象中的属性的时候,才执行sql语句查询。

类级别的延迟加载:
    Session对象的load方法默认是延迟加载。因为映射文件标签默认lazy=”true”。
    示例:Customer c = session.load(Customer.class, 1L);此时不发送sql语句,当使用该对象的属性时才发送。

关联级别的延迟加载:
    指的是从当前对象访问其关联的对象的延迟加载。
    默认存在。

2.2 查询策略

使用Hibernate查询一个对象的时候,查询其关联对象,应该如何查询,这是Hibernate的一种优化手段。
lazy属性处理查询时机的问题,需要配置是否采用延迟加载。
fetch属性处理查询语句的形式的问题。

2.3 set标签上配置策略

标签上使用fetch和lazy属性。
fetch的取值:控制sql语句生成的格式
    *select:默认值,普通查询语句。
    *join:连接查询,迫切左外连接查询。注意,配置后lazy属性无效。
    *substract:子查询。
lazy的取值:查找关联对象时是否采用延迟。
    *true:默认,延迟。
    *false:不延迟。
    *extra:及其懒惰。

set标签上的默认值是fetch=”select”和lazy=”true”,开发中一般使用默认值。

2.4 many-to-one标签上配置策略

标签上使用fetch和lazy属性。
fetch的取值:控制sql语句生成的格式。
    *select:默认值,普通查询语句。
    *join:连接查询,迫切左外连接查询。注意,配置后lazy属性无效。
lazy的取值:查找关联对象时是否采用延迟。
    *false:不采用延迟加载。
    *proxy:默认值。代理,由另一端的上的lazy确定是否延迟加载。

在标签上的默认值是fetch=”select”和lazy=”proxy”

你可能感兴趣的:(Hibernate)