`
反求诸己
  • 浏览: 543236 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

Hibernate Criteria 多层次查询关联问题(转)

 
阅读更多

轉載,收藏一下!

 

http://terrencemail.javaeye.com/blog/197821

hibernate 存在如下表及关联:

Java代码 复制代码
  1. class  House{   
  2.    private  string houseid;   
  3.    private  string housename;   
  4. }   
  5. class  Shelf{   
  6.    private  string shelfid;   
  7.    private  House house;   
  8. }   
  9. class  Position{   
  10.    private  string positionid;   
  11.    private  Shelf shelf;   
  12. }   
  13. class  Warehouse{   
  14.    private  string warehouseid;   
  15.    private  Position position;   
  16. }  
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,可使用如下方法:

Java代码 复制代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse. class );   
  2. criteria.createAlias( "position" "position" );   
  3. criteria.createAlias( "position.shelf" "shelf" );   
  4. criteria.add(expression_r.eq( "shelf.house.houseid" "111" ));  
Criteria criteria = BaseUtil.getCriteria(Warehouse.class); criteria.createAlias("position", "position"); criteria.createAlias("position.shelf", "shelf"); criteria.add(expression_r.eq("shelf.house.houseid", "111"));


如果要查询House的name, 必须再关联House表:

Java代码 复制代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse. class );   
  2. criteria.createAlias( "position" "position" );   
  3. criteria.createAlias( "position.shelf" "shelf" );   
  4. criteria.createAlias( "shelf.house" "house" );   
  5. criteria.add(expression_r.eq( "house.housename" "name A" ));  
Criteria criteria = BaseUtil.getCriteria(Warehouse.class); criteria.createAlias("position", "position"); criteria.createAlias("position.shelf", "shelf"); criteria.createAlias("shelf.house", "house"); criteria.add(expression_r.eq("house.housename", "name A"));


以上代码就可以实现了。

可是还会出现一个问题:如果表路径position已经被关联过了(比如此criteria是传入的参数,已经关联了Alias路径position, 并查询过了),则会报错。解决方法:
检查criteria里面关联的路径,如果已经关联,则不再关联,直接使用就行了。

Java代码 复制代码
  1. class  CriteriaUtil{   
  2. public   static  Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){   
  3.    if (path ==  null return  criteriaImpl;   
  4.    for (Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){   
  5.     Subcriteria subCriteria = (Subcriteria)iter.next();   
  6.      if (path.equals(subCriteria.getPath()))   
  7.        return  criteriaImpl;   
  8.   }   
  9.    return  criteriaImpl.createAlias(path, name);   
  10. }   
  11. }  
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()))
                  


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

调用代码就变成:

Java代码 复制代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse. class );   
  2. CriteriaUtil.addAlias((CriteriaImpl)criteria,  "position" "position" );   
  3. CriteriaUtil.addAlias((CriteriaImpl)criteria,  "position.shelf" "shelf" );   
  4. criteria.add(expression_r.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文档总结,技术汇总,PDF版的,hibernate简明参考文档

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

    Java Persistence with Hibernate

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

    hibernate程序高手秘笈-英文版

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

    hibernate独立开发包

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

    hibernate技术研究对比总结

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

    hibernate3.6.10 jar包

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

    Hibernate类库

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

    hibernate 3.5文档下载

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

    hibernate教材

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

    韩顺平Hibernate笔记

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

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

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

    Hibernate技术手册

    5. **查询语言HQL**:解释Hibernate查询语言,与SQL的关系,如何编写HQL查询,以及使用Criteria API进行复杂查询。 6. **关联映射**:讲解一对一、一对多、多对一、多对多的关联映射配置,如@OneToOne、@OneToMany...

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

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

    hibernate父亲与孩子

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

    hibernate5.0jar包

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

Global site tag (gtag.js) - Google Analytics