`

Hibernate 高级查询技巧——集合过滤与子查询

阅读更多
转载:http://blog.csdn.net/javacoffe/archive/2007/08/09/1733579.aspx

1、集合过滤:
     对于一个已经加载的Customer对象,假设对它的orders集合采用延迟加载机制,那么当调用customer.getOrders().iterator()时,Hibernate就会初始化orders集合,然后到数据库中去加载Customer对象所关联的Order对象,并且填充orders集合,但是很多时候我们其实只是需要关联对象中符合某些条件的一部分对象,而并不需要加载全部关联对象,而对性能带来无谓的开销。这时候我们就可以利用Hibernate的集合过滤功能,来处理关联对象的加载。我们看下面的代码:
List list=session.createFilter(customer.getOrders(),“where this.price>100 order by this.price”).list();
for(int i=0;i<list.size();i++){
 Order order=(Order)list.get(i);
}

在上面代码中通过session.createFilter()方法,创建了一个集合过滤的查询对象,这个方法需要两个参数,第一个参数指定需要进行过滤操作的集合,第二个参数指定过滤集合的条件,方法返回Query对象。这个方法不要求它所要操作的集合对象已经初始化,但是要求包含这个集合对象的实体对象必须处于持久化状态。当执行list()方法时不管持久化对象的集合是否已经初始化,都会到数据库中去检索数据,为了保证在Hibernate缓存中不会出现OID相同的对象,如果集合对象已经初始化,list()方法不会创建新的关联实体对象,而仅仅返回已经存在的关联实体对象。如果集合对象还没有初始化,那么list()方法会创建关联实体对象,但是不会初始化容纳关联实体对象的集合。除了可以向集合对象添加过滤条件进行稽核过滤之外,还可以进行很多其他操作,看下面的代码:
①    、对集合对象进行分页:
List list=session.createFilter(customer.getOders(),”order by this.price asc”)
.setFirstResult(10)
.setMaxResults(50)
.list();

②、检索集合中关联对象的一个属性:
List list=session.createFilter(customer.getOrders(),”select this.ordernumber ”).list();

2、子查询:
  子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持。如下面代码所示:
List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();

上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为:
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);

如果子查询返回多条记录,则可以使用下面关键字:
all:表示子查询语句返回的所有记录
any:表示子查询语句返回的任意一条结果
some:与”any”等价
in:与”=any”等价
exists:表示子查询语句至少返回一条记录
例如:查询存在一条订单价格大于100的客户
From Customer c where 100>any(select o.price from c.orders o);

如果在子查询中操作集合,HQL提供了一组操纵集合的函数和属性:
size()函数和size属性:获得集合中元素的数量
minIndex()函数和minIndex属性:对于建立了索引的集合获得最小索引值(关于集合索引参考第一部分映射值类型集合)
minElement()函数和minElement属性:对于包含基本类型的元素集合,获得集合中值最小的元素
maxElement()函数和maxElement属性:对于包含基本类型元素的集合,获得集合中值最大的元素
element()函数:获得集合中所有元素
例如:查询订单数大于0的客户
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL语句会生成类似如下的SQL语句:
Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);

注:在HQL中子查询必须出现在where子句中,而且必须用一对圆括号括起来。为什么必须要出现在where字句之后呢?其实我们大家仔细想一下也就知道了,在Hibernate中查询的任何一个实体对象都要有据可循,这个“据”就是Hibernate的主配置文件,也就是说凡是出现在HQL from字句中的实体对象,都必须要在Hibernate主配置文件中有明确的配置。所以在Hibernate中无法支持SQL语句中的那种出现在from字句之后的那种动态视图子查询。
 
分享到:
评论

相关推荐

    7.1.1Hibernate的入门必备——文档和源码

    【标题】"7.1.1Hibernate的入门必备——文档和源码"主要涉及的是Java领域的一个重要ORM框架——Hibernate的基础学习。Hibernate是一种用于Java应用的开源对象关系映射(ORM)工具,它允许开发者将Java类与数据库表...

    Hibernate的高级查询

    当我们需要进行更复杂的数据库查询时,Hibernate提供了丰富的高级查询功能,这正是“Hibernate的高级查询”这一主题的核心所在。 在Hibernate中,高级查询主要包括HQL(Hibernate Query Language)、Criteria API和...

    北大青鸟Hibernate单元练习项目——电影信息管理系统

    这是我花费4天的时间做的北大青鸟Hibernate单元练习项目。...如何使用好Criteria限制查询条件、怎样用好和标签,怎样进行增加验证......经历过项目才会对知识有更深层次的掌握,本资料对初学者一定很有帮助。

    提升Hibernate性能的魔方——IronTrack SQL.pdf

    Hibernate是一个流行的Java对象关系映射(ORM)框架,它极大地简化了Java应用与数据库的交互。然而,Hibernate的性能和效率问题一直是一个需要特别关注的领域。Hibernate自动生成的SQL语句可能在某些情况下并不是最...

    struts2+hibernate整合的例子——新闻管理系统

    Action类是业务逻辑的主要载体,通常会与Hibernate中的DAO(Data Access Object)层交互,完成数据的增删改查操作。 Hibernate则用于管理和操作数据库。在该项目中,它可能定义了News实体类,对应数据库中的新闻表...

    hibernate子查询

    在使用Hibernate进行数据查询时,有时会遇到需要使用子查询的情况。然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL...

    Hibernate 函数 ,子查询 和原生SQL查询

    2. **比较操作符**:`from Entity e where e.value &gt; (select avg(value) from Entity)`,可以比较当前实体的值与子查询的平均值。 3. **EXISTS/NOT EXISTS**:`from Entity e where exists (select 1 from ...

    Hibernate QBC高级查询.rar

    **正文** Hibernate是一个Java开发中的持久化框架...提供的资源“Hibernate QBC高级查询.wps”应该包含详细的讲解和示例代码,帮助你掌握这些高级技巧。请仔细研读,通过实践来巩固理论知识,提升你的Hibernate技能。

    MyClipse6.0\Struts2,Spring与Hibernate整合应用,学生成绩管理系统

    《Struts2、Spring与Hibernate整合应用:学生成绩管理系统》 在IT行业中,构建一个高效、稳定的Web应用程序常常需要整合不同的框架。本项目“学生成绩管理系统”就是基于Struts2、Spring和Hibernate三大主流Java ...

    Hibernate高级教程

    3. **对象关系映射(ORM)**:讲解Hibernate的核心——ORM技术,如何通过注解或XML配置文件将Java类与数据库表进行映射,包括实体类的定义、主键生成策略、属性映射等。 4. **Session和Transaction**:深入理解...

    JavaEE高级工程师I培训——框架核心技术Struts.Hibernate.Spring

    在"JavaEE高级工程师I培训——框架核心技术Struts.Hibernate.Spring"课程中,你将学习到如何有效地利用这三个框架,包括但不限于以下内容: 1. Struts框架的架构设计和工作原理 2. 创建和配置Struts2应用,包括...

    Hibernate使用——入门

    **Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...

    Hibernate面试题部分汇总集合

    Hibernate面试题部分汇总集合Hibernate面试题部分汇总集合

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)...

    hibernate过滤器使用例子

    在探讨“hibernate过滤器使用例子”这一主题时,我们深入分析了如何在Hibernate框架中运用过滤器功能,以及如何结合分页技术优化数据查询效率。以下将详细阐述相关知识点,包括过滤器的基本概念、配置方法、源码解析...

    Hibernate分页查询小结

    Hibernate分页查询小结

    Hibernate在查询条件中创建List集合

    本文将深入探讨如何在Hibernate中利用查询条件创建List集合,这在处理复杂的数据筛选和聚合时尤其有用。 首先,让我们理解在Hibernate中创建List集合的基本概念。List集合是Java集合框架的一部分,它可以存储有序且...

    hibernate映射和查询

    **hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...

    struts2+hibernate整合例子——新闻管理系统

    总结来说,"struts2+hibernate整合例子——新闻管理系统"是一个典型的Java Web应用示例,展示了如何利用Struts2的MVC模式和Hibernate的ORM能力,实现对新闻数据的CRUD操作及高级查询。这个系统可能包含了Action类、...

Global site tag (gtag.js) - Google Analytics