Hibernate查询方式与抓取策略(优化)

4. Hibernate查询方式与抓取策略(优化)


申明:本篇博客引用黑马教育;Hibernate其他系列为博主根据黑马教育整理得到。

上接Hibernate关联映射(一对多/多对多):https://blog.csdn.net/biggerchong/article/details/84340105


目录

4. Hibernate查询方式与抓取策略(优化)

4.1 OID查询

4.1.1 使用get方法

4.1.2 使用load方法

4.2 对象导航检索

4.3 HQL检索

初始化一些数据

HQL的简单查询

HQL的别名查询

HQL的排序查询

HQL的条件查询

HQL的投影查询

HQL的分页查询

HQL的分组统计查询

HQL的多表查询

4.4 QBC检索

简单查询

排序查询

分页查询

条件查询

统计查询

离线条件查询DetachedCriteria

4.5 SQL检索

SQL查询

4.6 Hibernate的抓取策略(优化)

4.6.1 延迟加载的概述

4.6.2 抓取策略

i. 上的fetch和lazy

ii. 上的fetch和lazy

4.6.3 批量抓取


在Hibernate中提供了很多种的查询的方式Hibernate共提供了五种查询方式。

4.1 OID查询

OID检索:Hibernate根据对象的OID(主键)进行检索

4.1.1 使用get方法

Customer customer = session.get(Customer.class,1l);

4.1.2 使用load方法

Customer customer = session.load(Customer.class,1l);


4.2 对象导航检索

对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

LinkMan linkMan = session.get(LinkMan.class,1l);

Customer customer  = linkMan.getCustomer();

Customer customer = session.get(Customer.class,2l);

Set<LinkMan> linkMans = customer.getLinkMans();


4.3 HQL检索

HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。

初始化一些数据

HQL的简单查询

HQL的别名查询

HQL的排序查询

HQL的条件查询

HQL的投影查询

投影查询:查询对象的某个或某些属性。

HQL的分页查询

HQL的分组统计查询

HQL的多表查询

SQL的多表查询

连接查询

         交叉连接:笛卡尔积

           select * from A,B;

         内连接     :inner join (inner 可以省略)

                       隐式内连接:

                            select * from A,B where A.id = B.id;

                     显示内连接:

                            select * from A inner join B on A.id = B.id;

        外连接     :

                   左外连接:left outer join(outer 可以省略)

                           select * from A left outer join B on A.id= B.id;

                    右外连接:right outer join(outer 可以省略)

                            select * from A right outer join B on A.id = B.id;

          子查询

 

HQL的多表查询

    连接查询

  1. 交叉连接
  2. 内连接
    1. 显示内连接
    2. 隐式内连接
    3. 迫切内连接
  3. 外连接
    1. 左外连接
    2. 右外连接
    3. 迫切左外连接

 

迫切内连接/迫切左外连接:迫切fetch将连接查询到的Object的结果集转换成Customer的结果集。


4.4 QBC检索

QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

简单查询

排序查询

分页查询

条件查询

统计查询

离线条件查询DetachedCriteria

         DetachCriteria查询适用于多条件查询(按距离/按访问量/按好评率等的查询),DetachCriteria查询先将条件合并整合起来,然后一起来查找;这样避免了一步步查找造成对查询效率的削弱。


4.5 SQL检索

SQL查询

SQL查询:通过使用sql语句进行查询;可以利用sqlQuery.addEntity(具体类.class);将查询得到的Object集转换为指定类的集。

 


4.6 Hibernate的抓取策略(优化)

4.6.1 延迟加载的概述

什么是延迟加载

延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

延迟加载的分类

  1. 类级别的延迟加载
    1. 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
    2. 类级别延迟加载通过<class>上的lazy进行配置,如果让lazy失效
      1. 将lazy设置为false
      2. 将持久化类使用final修饰
      3. Hibernate. Initialize()
  2. 关联级别的延迟加载
    1. 指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。

Customer customer = session.get(Customer.class,1l);

customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。抓取策略往往会和关联级别的延迟加载一起使用,优化语句。

4.6.2 抓取策略

抓取策略的概述

  1. 通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。
    1. 通过<set>或者<many-to-one>上通过fetch属性进行设置
    2. fetch和这些标签上的lazy设置优化发送的SQL语句

i. <set>上的fetch和lazy

  1. fetch:抓取策略,控制SQL语句格式
    1. select                 :默认值,发送普通的select语句,查询关联对象
    2. join                     :发送一条迫切左外连接查询关联对象
    3. subselect          :发送一条子查询查询其关联对象
  2. lazy:延迟加载,控制查询关联对象的时候是否采用延迟
    1. true                    :默认值,查询关联对象的时候,采用延迟加载
    2. false                   :查询关联对象的时候,不采用延迟加载
    3. extra                  :及其懒惰。
  3. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

ii. <many-to-one>上的fetch和lazy

 

注:当Customer.hbm.xml中的class标签中lazy=”false”many-to-one上的lazy配置将无效。

  1. fetch :抓取策略,控制SQL语句格式。
    1. select       :默认值,发送普通的select语句,查询关联对象。
    2. join            :发送一条迫切左外连接。
  2. lazy   :延迟加载,控制查询关联对象的时候是否采用延迟。
    1. proxy        :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。
    2. false          :查询关联对象,不采用延迟。
    3. no-proxy  :(不会使用)
  3. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

4.6.3 批量抓取

什么是批量抓取

       一批关联对象一起抓取,batch-size

通过配置batch-size=”n” 来设置批量抓取的数量(通俗的来说你设置n=3,抓取的时候一次抓3个,如果关联数为8,共抓取3---不足3个也能一起抓)

测试批量抓取


Hibernate从入门到深入已经结束,感谢您对Hibernate全套知识的关注!

Hibernate实战之JavaEE网购整合:https://blog.csdn.net/biggerchong/article/details/84475898  

                                                                                                                   -----谢谢阅读             -----知飞翀

猜你喜欢

转载自blog.csdn.net/biggerchong/article/details/84402907