`

Hibernate Criteria 多层次查询关联问题

 
阅读更多
http://terrencemail.iteye.com/blog/197821
第 16 章  条件查询(Criteria Queries) http://oss.org.cn/ossdocs/framework/hibernate/reference-v3_zh-cn/querycriteria.html
hibernate存在如下表及关联:
class House{  
  private string houseid;  
  private string housename;  
}
 
class Shelf{  
  private string shelfid;  
  private House house;  
} 

class Position{  
  private string positionid;  
  private Shelf shelf;  
}  

class Warehouse{  
  private string warehouseid;  
  private Position position;  
} 


Warehouse外键关联Pisition, Position外键关联Shelf, Shelf外键关联houseid。
现在要对Warehouse使用Criteria查询, 查询House的id,可使用如下方法: 
Criteria criteria = BaseUtil.getCriteria(Warehouse.class);  
criteria.createAlias("position", "position");  
criteria.createAlias("position.shelf", "shelf");  
criteria.add(Expression.eq("shelf.house.houseid", "111")); 


如果要查询House的name, 必须再关联House表: 
Criteria criteria = BaseUtil.getCriteria(Warehouse.class);  
criteria.createAlias("position", "position");  
criteria.createAlias("position.shelf", "shelf");  
criteria.createAlias("shelf.house", "house");  
criteria.add(Expression.eq("house.housename", "name A")); 


以上代码就可以实现了。

可是还会出现一个问题:如果表路径position已经被关联过了(比如此criteria是传入的参数,已经关联了Alias路径position, 并查询过了),则会报错。解决方法:
检查criteria里面关联的路径,如果已经关联,则不再关联,直接使用就行了。 
class CriteriaUtil{  
public static Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){  
  if(path == null) return criteriaImpl;  
  for(Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){  
    Subcriteria subCriteria = (Subcriteria)iter.next();  
    if(path.equals(subCriteria.getPath()))  
      return criteriaImpl;  
  }  
  return criteriaImpl.createAlias(path, name);  
}  
} 


(注:这段代码有时是存在问题的,不是所有的Criteria 都能转换为CriteriaImpl,可能会是Subcriteria。因此,需要确保传入的参数为CriteriaImpl)

调用代码就变成: 
Criteria criteria = BaseUtil.getCriteria(Warehouse.class);  
CriteriaUtil.addAlias((CriteriaImpl)criteria, "position", "position");  
CriteriaUtil.addAlias((CriteriaImpl)criteria, "position.shelf", "shelf");  
criteria.add(Expression.eq("shelf.house.houseid", "111"));  
分享到:
评论

相关推荐

    Hibernate学习:单向多对一关联 工程

    本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...

    hibernate自身关联一对多实例(树形结构)

    本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...

    hibernate5.2.9

    14. **多态性支持**:在查询时,Hibernate可以处理不同类层次结构下的对象,提供了一种强大的多态性支持。 通过学习Hibernate 5.2.9的源码,可以深入了解其内部实现,包括查询解析、结果集转换、缓存策略等细节,有...

    Hibernate电子书(全)

    `Query`接口允许使用HQL(Hibernate Query Language)或SQL进行查询,而`Criteria`API则提供了一种基于标准的查询方式,无需了解具体的SQL语法。对于数据的更新和删除,Hibernate同样提供了简单的方法,只需调用对应...

    hibernate程序高手秘笈-英文版

    7. **关联映射**:详细解析一对一、一对多、多对一、多对多的各种关联映射,包括集合类型如List、Set、Map的使用。 8. **延迟加载和立即加载**:了解何时使用延迟加载和立即加载,以及它们对性能的影响。 9. **...

    hibernate独立开发包

    10. **继承映射**:Hibernate允许实体类之间进行单表继承、联合继承和多表继承,以适应不同层次的类结构。 11. **延迟加载(Lazy Loading)**:为提高性能,Hibernate提供了延迟加载机制,只有当真正需要访问关联...

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    13. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多的关联映射,允许对象之间建立复杂的关联关系。 14. **事件监听器**: Hibernate允许注册事件监听器,监听对象的生命周期事件,如加载、保存、更新和...

    Java Persistence with Hibernate

    - **关联映射**:Hibernate支持一对一、一对多和多对多等多种关联映射类型,能够灵活地处理复杂的数据关系。 - **继承映射**:对于具有层次结构的对象模型,Hibernate提供了策略来处理继承关系,包括单表继承、分类...

    hibernate3.6.10 jar包

    8. **多态性支持**:Hibernate支持单继承和多继承的映射,可以处理不同类型的对象,这在处理具有层次结构的数据时非常有用。 9. **事件监听器**:Hibernate提供了一套事件监听系统,开发者可以通过实现特定接口或...

    hibernate技术研究对比总结

    Hibernate 提供了自己的查询语言 HQL,类似于 SQL 但面向对象,还提供了 Criteria API 作为另一种动态查询方式。 ### 6. 事务管理 介绍了 Hibernate 如何集成 Spring 或其他框架进行事务处理,包括编程式事务和...

    Hibernate类库

    7. **Criteria查询**:除了标准的SQL查询外,Hibernate还提供了Criteria API,允许以面向对象的方式构建查询,避免了字符串拼接SQL的错误风险。 8. **HQL(Hibernate Query Language)**:HQL是Hibernate的专用查询...

    hibernate教材

    Hibernate 支持类的继承映射,可以将继承层次结构映射到数据库的单表或多表。具体有三种策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)和表-per-class-hierarchy(Table per ...

    hibernate V3.04 中文,日文参考手册.rar

    9. **多态性支持**:Hibernate允许在查询时处理不同继承层次的对象,提供了对多态查询的良好支持。 10. **级联操作(Cascading)**:级联操作允许在一个对象的操作中自动处理相关对象,如删除一个实体时,可以选择...

    Hibernate技术手册

    7. **懒加载与立即加载**:探讨Hibernate的懒加载机制,如何避免N+1查询问题,以及何时使用立即加载。 8. **缓存机制**:介绍Hibernate的缓存层次,一级缓存(Session缓存)、二级缓存(SessionFactory缓存)和查询...

    Hibernate教程03_Hibernate核心开发接口介绍

    Hibernate是一个强大的Java对象关系映射(ORM)框架,它消除了传统SQL编程的繁琐,提供了更高层次的抽象,使我们能够用面向对象的方式处理数据。 1. **SessionFactory接口**: SessionFactory是Hibernate的核心组件...

    hibernate父亲与孩子

    同时,我们可以利用Hibernate的Criteria API或HQL(Hibernate Query Language)来编写高效的查询,以获取特定层次或路径的节点。 5. **缓存策略**:对于大型树结构,缓存策略的设置至关重要。Hibernate提供了第一级...

    韩顺平Hibernate笔记

    5. **CRUD操作**:通过实例展示如何使用Hibernate进行增删查改(Create, Read, Update, Delete)操作,包括对象状态管理、HQL(Hibernate Query Language)查询和Criteria API的使用。 6. **关联映射**:深入探讨一...

    hibernate 3.5文档下载

    10. **多态性支持**:Hibernate支持多态查询,允许在查询中使用继承层次结构中的任何类,使得代码更具扩展性。 11. **延迟加载(Lazy Loading)**:为了提高性能,Hibernate允许关联对象的延迟加载,只有当真正需要...

    hibernate5.0jar包

    9. **Association Mapping**:Hibernate支持多种关联映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),使对象间的关联关系能够映射到数据库表的外键关系。 10. **...

Global site tag (gtag.js) - Google Analytics