`
anson_xu
  • 浏览: 514664 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

Hibernate集合过滤、子查询

阅读更多
Hibernate集合过滤、子查询
来自:http://blog.csdn.net/javacoffe/archive/2007/08/09/1733579.aspx
1、集合过滤:
     对于一个已经加载的Customer对象,假设对它的orders集合采用延迟加载机制,那么当调用customer.getOrders().iterator()时,Hibernate就会初始化orders集合,然后到数据库中去加载Customer对象所关联的Order对象,并且填充orders集合,但是很多时候我们其实只是需要关联对象中符合某些条件的一部分对象,而并不需要加载全部关联对象,而对性能带来无谓的开销。这时候我们就可以利用Hibernate的集合过滤功能,来处理关联对象的加载。我们看下面的代码:

Java代码
1.List list=session.createFilter(customer.getOrders(),“where this.price>100 order by this.price”).list();  
2.for(int i=0;i<list.size();i++){  
3. Order order=(Order)list.get(i);  
4.} 
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()方法会创建关联实体对象,但是不会初始化容纳关联实体对象的集合。除了可以向集合对象添加过滤条件进行稽核过滤之外,还可以进行很多其他操作,看下面的代码:
①    、对集合对象进行分页:

Java代码
1.List list=session.createFilter(customer.getOders(),”order by this.price asc”)  
2..setFirstResult(10)  
3..setMaxResults(50)  
4..list(); 
List list=session.createFilter(customer.getOders(),”order by this.price asc”)
.setFirstResult(10)
.setMaxResults(50)
.list();
②、检索集合中关联对象的一个属性:

Java代码
1.List list=session.createFilter(customer.getOrders(),”select this.ordernumber ”).list(); 
List list=session.createFilter(customer.getOrders(),”select this.ordernumber ”).list();
2、子查询:
  子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持。如下面代码所示:

Java代码
1.List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list(); 
List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();
上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为:

Java代码
1.Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID); 
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
如果子查询返回多条记录,则可以使用下面关键字:

Java代码
1.all:表示子查询语句返回的所有记录  
2.any:表示子查询语句返回的任意一条结果  
3.some:与”any”等价  
4.in:与”=any”等价  
5.exists:表示子查询语句至少返回一条记录 
all:表示子查询语句返回的所有记录
any:表示子查询语句返回的任意一条结果
some:与”any”等价
in:与”=any”等价
exists:表示子查询语句至少返回一条记录
例如:查询存在一条订单价格大于100的客户

Java代码
1.From Customer c where 100>any(select o.price from c.orders o); 
From Customer c where 100>any(select o.price from c.orders o);
如果在子查询中操作集合,HQL提供了一组操纵集合的函数和属性:

Java代码
1.size()函数和size属性:获得集合中元素的数量  
2.minIndex()函数和minIndex属性:对于建立了索引的集合获得最小索引值(关于集合索引参考第一部分映射值类型集合)  
3.minElement()函数和minElement属性:对于包含基本类型的元素集合,获得集合中值最小的元素  
4.maxElement()函数和maxElement属性:对于包含基本类型元素的集合,获得集合中值最大的元素  
5.element()函数:获得集合中所有元素 
size()函数和size属性:获得集合中元素的数量
minIndex()函数和minIndex属性:对于建立了索引的集合获得最小索引值(关于集合索引参考第一部分映射值类型集合)
minElement()函数和minElement属性:对于包含基本类型的元素集合,获得集合中值最小的元素
maxElement()函数和maxElement属性:对于包含基本类型元素的集合,获得集合中值最大的元素
element()函数:获得集合中所有元素
例如:查询订单数大于0的客户

Java代码
1.From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0; 
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL语句会生成类似如下的SQL语句:

Java代码
1.Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id); 
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字句之后的那种动态视图子查询。
分享到:
评论

相关推荐

    hibernate 中HQL语句查询学习笔记

    用于与子查询的结果集合进行比较: ```hql SELECT s FROM Student s WHERE s.sage &gt; ANY (SELECT c.ccredit FROM Course c); ``` 这将返回年龄大于任一课程学分的学生。 #### HQL的多表查询 当需要查询跨多个表...

    如何提高hibernate性能

    当需要抓取延迟加载的集合或单值代理时,Hibernate会使用子查询一次性加载所有实例。这种方法避免了破碎的加载,提高了效率。 6. **延迟属性抓取(Lazy Property Fetching)**: Hibernate 3支持对单独属性进行...

    Hibernate+中文文档

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    hibernate3.2中文文档(chm格式)

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    HibernateAPI中文版.chm

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    Hibernate实战(第2版 中文高清版)

     13.2.2 通过子查询预抓取集合   13.2.3 通过联结即时抓取   13.2.4 给二级表优化抓取   13.2.5 优化指导方针   13.3 高速缓存基本原理   13.3.1 高速缓存策略和范围   13.3.2 Hibernate高速缓存架构 ...

    hibernate-3.6.8-doc-zh

    3. 谨慎使用JOIN操作:在大型项目中,过多的JOIN可能导致性能下降,考虑使用子查询或多次查询。 4. 事务边界设定:正确划分事务边界,确保数据一致性。 通过阅读和理解Hibernate 3.6.8的中文文档,开发者不仅可以...

    Hibernate 中文 html 帮助文档

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) 16.1.3....

    Hibernate中文详细学习文档

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    HQL(Hibernate Query Language):

    7. **子查询**:在SELECT或WHERE子句中使用子查询,提供更灵活的查询方式。 8. **动态实例化**:允许在查询中创建新的对象实例,例如"FROM User AS u WHERE u.email LIKE '%%' ORDER BY u.username DESC"。 HQL还...

    最全Hibernate 参考文档

    19.1.5. 使用子查询抓取(Using subselect fetching) 19.1.6. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     18.4.2 集合过滤  18.4.3 子查询  18.4.4 本地SQL查询  18.4.5 查询结果转换器  18.5 查询性能优化  18.5.1 iterate()方法  18.5.2 查询缓存  18.6 小结  18.7 思考题 第19章 Hibernate高级配置  19.1 ...

    hibernate 体系结构与配置 参考文档(html)

    离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.2. 别名和属性引用 16.3. 命名SQL查询 16.3.1. 使用return-property来明确地...

    Hibernate教程

    16.8. 离线(detached)查询和子查询 17. Native SQL查询 17.1. 创建一个基于SQL的Query 17.2. 别名和属性引用 17.3. 命名SQL查询 17.3.1. 使用return-property来明确地指定字段/别名 17.3.2. 使用存储过程来查询...

    hibernate3.6 文档(pdf 格式)

    - **游离查询与子查询**:解释如何处理游离查询和子查询。 #### 十八、本机 SQL - **使用 SQLQuery**:介绍如何使用 SQLQuery 接口执行原生 SQL 查询。 - **标量查询**:解释如何查询并返回标量值。 - **实体查询**...

    hibernate 教程

    子查询 11.12. HQL示例 11.13. 提示和技巧(Tips & Tricks) 12. 条件查询(Criteria Query) 12.1. 创建一个Criteria实例 12.2. 缩小结果集范围 12.3. 对结果排序 12.4. 关联(Associations)...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    hibernate3.6中文手册

    9. **其他高级特性**:涵盖了如查询缓存、事件监听器、过滤器、子查询等高级特性,帮助开发者深入挖掘Hibernate的潜力。 10. **实例分析**:手册通常会包含大量示例代码,通过实际应用场景的演示,帮助读者理解并...

    hibernate学习笔记

    - **subselect**:可选属性,用于懒加载时定义一个 SQL 子查询。 - **lazy**:可选属性,默认为 `true`,表示是否懒加载集合。 - **sort**:可选属性,默认为 "unsorted",表示集合的排序方式。 - **inverse**:可选...

    Hibernate性能调优

    - 针对非常大的集合,可以使用`createFilter`方法来进行过滤或分页。 #### 五、继承关系中的隐式多态 在具有继承关系的实体中,正确配置多态属性可以极大地提高查询效率。 - **定义**:多态属性允许在一个查询中...

Global site tag (gtag.js) - Google Analytics