`
zwt2001267
  • 浏览: 444724 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate的检索方式(五)

 
阅读更多

五、高级查询技巧

 

2、集合过滤

       延迟检索策略――customer.getOrders().iterator() (加载关联对象集合),这种方式的不足:

l         全部加载

l         不能排序

 

2种办法可以解决上边不足,一种是通过HQLQBC查询orders集合,还有一种办法就是使用集合过滤

 

集合过滤示例:

    List result=session.createFilter(customer.getOrders(),           "where this.price>200 order by this.price").list();    Iterator it=result.iterator();    while(it.hasNext()){       Order order =(Order)it.next();       .....

    }

 

       SessioncreateFilter()方法用来过滤集合,它具有以下特定。

l         返回Qurey类型的实例。

l         第一个参数:指定一个持久化对象的集合,这个集合是否已经被初始化并没有关系,但它所属的对象必须处于持久化状态。否则抛出异常。

l         第二个参数:指定过滤条件,它由合法的HQL查询语句组成。

l         不管持久化对象的集合是否已经初始化,Querylist()方法都会执行SQL查询语句,到数据库中检索Order对象。

l         如果对象的集合已经被初始化,为了保证Session的缓存中不会出现OID相同的Order对象,Querylist()方法不会再创建Order对象,仅仅返回已经存在的Order对象的引用。

l         如果没有初始化,Querylist()方法创建相应的对象,但不会初始化所给对象的集合。(仅仅取出符合条件的对象集合,是对象集合的子集)

 

集合过滤的几个应用:

A、为集合排序或设置约束条件

B、 集合分页

C、 检索集合中对象的某个属性

D、检索数据库中与Customer对象的orders集合中的Order对象的属性(一个或多个)相同的所有Order对象

E、 检索Order对象的lineItems集合中LineItem对象的Item

 

代码示例:

     List result=session.createFilter(customer.getOrders(),        " order by this.price asc")        .setFirstResult(10)        .setMaxResults(5)        .list();          List result=session.createFilter(customer.getOrders(),        "select this.orderNumber")        .list();          List result=session.createFilter(customer.getOrders(),        "select other from Order other where other.price=this.price")        .list();          List result=session.createFilter(order.getLineItems(),        "select this.item")

        .list();

 

3、子查询

       HQL支持where子句中嵌入查询语句。

from Customer c where 1<(select count(o) from c.orders o) ――相关子查询

from Order o where o.price>(select avg(o1.price) from Order o1)  无关

 

       关于子查询的用法说明:

       1)、子查询可以分为相关子查询和无关子查询。

       2)、依赖底层数据库对子查询的支持能力。

       3)、如果子查询语句返回多条记录,可以用一下关键字来衡量。

l         all:表示子查询语句返回的所有记录。

l         any:任意一条记录。

l         some:与“any”等价。

l         in:与“=any”等价。

l         exists:至少返回一条记录。

例:订单的价格都不小于100的客户

from Customer c where 100>all (select o.price from c.orders o)

有一条订单的价格小于100的客户

from Customer c where 100>any (select o.price from c.orders o)

有一条订单的价格等于100的客户

from Customer c where 100=some (select o.price from c.orders o)

from Customer c where 100=any (select o.price from c.orders o)

from Customer c where 100 in (select o.price from c.orders o)

至少有一条订单的客户

from Customer c where exsist (from c.orders)

 

4)、如果子查询语句查询的是集合,HQL提供了所写语法

     Iterator it=session.createQurey(               "from Customer c where :order in element(c.orders)")                  .setEntity("order",order)                  .list()

                  .iterator();

       element(c.orders)等价于(from c.orders

 

       HQL提供了一族操纵集合的函数或者属性。

l         size()函数或size属性:获取集合中元素的数目。

l         minIndex()函数或minIndex属性:对于建立了索引的集合,获取最小的索引。

l         maxIndex()函数或maxIndex属性:对于建立了索引的集合,获取最大的索引。

l         minElement()函数或minElement属性:对于包含基本类型元素的集合,获得集合中取值最小的元素。

l         maxElement()函数或maxElement属性:对于包含基本类型元素的集合,获得集合中取值最大的元素。

l         elements()函数:获得集合中所有元素。

 

如:订单数目大于零的客户

from Customer c where c.orders.size>0

或者  from Customer c where size(c.orders)>0

  

4、本地SQL查询

       Hibernate本地SQL查询提供了支持,为了把SQL查询返回的关系数据映射为对象,需要在SQL查询语句中为字段指定别名。

    String sql1 = "select cs.ID as {c.id},cs.name as {c.name} "           + "from CUSTOMERS cs where cs.ID=1";

    Query query = session.createSQLQurey(sql1, "c", Customer.class);

    String sql1 = "select {c.*} "       + "from CUSTOMERS c where c.ID=1";

    Query query = session.createSQLQurey(sql1, "c", Customer.class);

多个不同的对象情况

String sql1 = "select {c.*},{o.*} from CUSTOMERS c inner join ORDERS o"           + " where c.ID=o.CUSTOMER_ID";    Query query = session.createSQLQurey(sql1, new String[] { "c", "o" },

           new Class[] { Customer.class, Order.class });

 

       在程序中嵌入本地SQL语句会增加维护程序代码的难度,如果数据库表的结构发生变化,必须修改相应的程序代码,因此更合理的方式是把SQL查询语句放到映射文件中:

    <sql-query name="findCustomersAndOrders"><![CDATA[         select {c.*},{o.*} from CUSTOMERS c inner join ORDERS o           where c.ID=o.CUSTOMER_ID                                              ]]>       <return alias="c" class="Customer">       <return alias="o" class="Order">

    </sql-query>

  

六、查询性能优化

1、  降低访问数据库的频率,减少select语句的数目。实现手段包括:

l         使用迫切左外连接或迫切内连接检索策略。

l         对延迟加载或立即加载策略设置批量检索数目。

l         使用查询缓存。

2、避免多余加载程序不需要访问的数据。实现手段包括:

l         使用延迟检索策略。

l         使用集合过滤。

3、  避免报表查询数据占用缓存。实现手段为利用投影查询功能,查询出实体的部分属性。

4、减少select语句中的字段,从而降低访问数据库的数据量。实现手段为利用Queryiterate()方法。

  

iterate()方法:

       Query接口的iterate()方法和list()方法都能执行SQL查询语句。

       list()首先检索ID字段,然后根据ID字段到Hibernate第一缓存以及第二级缓存中查找匹配的对象,如果存在,就直接把它加入到查询结果集中,否则就只想额外的select语句,根据ID字段数据库中检索该对象。

 

查询缓存

       查询缓存适应以下场合:

l         在应用程序运行时经常使用的查询语句。

l         很少对与查询语句关联的数据库数据进行插入、删除或更新操作。

 

查询语句启用查询缓存的步骤如下:

A、配置第二级缓存。

B、 Hibernatehibernate.properties配置文件中设置查询缓存属性:

hibernate.cache.use_query_cache=true

       C、启用查询缓存。调用Query接口的setCacheable(true)方法。

分享到:
评论

相关推荐

    day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询

    本教程将深入探讨"day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询"的主题,通过源码分析和实际工具的应用,来提升数据库查询的效率。 首先,我们了解Hibernate的检索方式。在Hibernate中,...

    day36 04-Hibernate检索方式:多表连接查询

    标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...

    HIBERNATE检索策略

    标题:“HIBERNATE检索策略” 描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...

    Hibernate的检索方式

    ### Hibernate的五种检索方式详解 #### 一、导航对象图检索方式 导航对象图检索是一种常见的对象关联查询方式。这种方式通常用于加载已经存在于内存中的对象,并通过这些对象访问与其关联的对象。例如,在一个订单...

    Hibernate检索方式

    ### Hibernate检索方式详解 #### 一、概述 Hibernate是一个强大的对象关系映射(ORM)框架,它可以将Java对象与数据库表进行映射,使得开发者能够更方便地进行数据的持久化操作。在Hibernate中,提供了多种检索...

    hibernate5--4.检索方式及策略

    一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是基于类和对象的。你可以通过HQL来查询、更新和删除对象,而无需关心底层的SQL语法。...

    java-Hibernate 检索

    Hibernate 是一个流行的 Java 持久层框架,它提供了多种检索数据的方式,包括导航对象图检索、OID 检索、HQL 检索、QBC 检索和本地 SQL 检索等。下面将详细介绍每种检索方式。 一、导航对象图检索 导航对象图检索...

    Hibernate数据检索(HQL)笔记

    ### Hibernate数据检索(HQL)知识点详解 #### 一、简介 Hibernate 是一款开源的对象关系映射(ORM)框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。本文档基于...

    Hibernate数据检索(HQL)笔记

    在 Hibernate 中,数据检索可以使用 HQL 语句或 Criteria API 两种方式。HQL 语句是一种类似 SQL 的查询语言,用于定义查询条件和检索数据,而 Criteria API 则是一种基于对象的查询接口,用于构建查询条件和检索...

    基于Spring的Hibernate Search全文检索功能示例

    3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供了基于Lucene的全文检索功能,使得在数据库中的数据可以被快速、精确地搜索。 **二、集成Hibernate Search** 1. **配置依赖**:首先,你...

    浪磬J2EE第一期 Hibernate专题 第六讲 检索方式

    一、Hibernate检索方式概述 Hibernate提供了多种检索数据的方法,以适应不同的需求场景。这些方法包括:HQL(Hibernate Query Language)、QBC(Query By Criteria)、Criteria API以及直接使用Session的get()和load...

    Hibernate的检索策略

    ### Hibernate的检索策略详解 #### 一、概述 在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码...

    hibernate基础 注解开发 检索

    Hibernate提供了多种方式来查询数据,包括HQL、QBC和本地SQL。 - **HQL (Hibernate Query Language)**:一种面向对象的查询语言,类似于SQL但更加面向对象。 - **QBC (Query By Criteria)**:基于标准的API提供了一...

    Hibernate 对象的状态检索

    本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式

    hibernate中五个核心接口

    Query 和 Criteria 接口提供了灵活的数据检索方式。Query 接口支持 HQL(Hibernate Query Language)和 SQL 查询,而 Criteria 接口则提供了一种基于标准 SQL 的查询方式。 **特点:** - **HQL 支持**:Query 接口...

    hibernate的检索

    【Hibernate检索策略】 Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便...

    使用 hibernate-search 实现全文检索及文档管理的例子

    **使用Hibernate Search实现全文检索及文档管理** 在Java开发中,全文检索和文档管理是常见的需求,特别是对于大型的企业级应用。Hibernate Search是Hibernate ORM框架的一个扩展,它提供了对数据库中的对象进行...

    hibernate的延迟检索在轻量级J2EE框架中的应用

    通过这种方式,只有当确实需要访问集合中的数据时,Hibernate才会执行数据库查询,从而节省了资源。 #### 3. 延迟加载在轻量级J2EE框架中的应用 在轻量级J2EE框架中,如Spring+Hibernate,延迟加载机制的应用非常...

Global site tag (gtag.js) - Google Analytics