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允许...
14. **多态性支持**:在查询时,Hibernate可以处理不同类层次结构下的对象,提供了一种强大的多态性支持。 通过学习Hibernate 5.2.9的源码,可以深入了解其内部实现,包括查询解析、结果集转换、缓存策略等细节,有...
`Query`接口允许使用HQL(Hibernate Query Language)或SQL进行查询,而`Criteria`API则提供了一种基于标准的查询方式,无需了解具体的SQL语法。对于数据的更新和删除,Hibernate同样提供了简单的方法,只需调用对应...
7. **关联映射**:详细解析一对一、一对多、多对一、多对多的各种关联映射,包括集合类型如List、Set、Map的使用。 8. **延迟加载和立即加载**:了解何时使用延迟加载和立即加载,以及它们对性能的影响。 9. **...
10. **继承映射**:Hibernate允许实体类之间进行单表继承、联合继承和多表继承,以适应不同层次的类结构。 11. **延迟加载(Lazy Loading)**:为提高性能,Hibernate提供了延迟加载机制,只有当真正需要访问关联...
13. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多的关联映射,允许对象之间建立复杂的关联关系。 14. **事件监听器**: Hibernate允许注册事件监听器,监听对象的生命周期事件,如加载、保存、更新和...
- **关联映射**:Hibernate支持一对一、一对多和多对多等多种关联映射类型,能够灵活地处理复杂的数据关系。 - **继承映射**:对于具有层次结构的对象模型,Hibernate提供了策略来处理继承关系,包括单表继承、分类...
8. **多态性支持**:Hibernate支持单继承和多继承的映射,可以处理不同类型的对象,这在处理具有层次结构的数据时非常有用。 9. **事件监听器**:Hibernate提供了一套事件监听系统,开发者可以通过实现特定接口或...
Hibernate 提供了自己的查询语言 HQL,类似于 SQL 但面向对象,还提供了 Criteria API 作为另一种动态查询方式。 ### 6. 事务管理 介绍了 Hibernate 如何集成 Spring 或其他框架进行事务处理,包括编程式事务和...
7. **Criteria查询**:除了标准的SQL查询外,Hibernate还提供了Criteria API,允许以面向对象的方式构建查询,避免了字符串拼接SQL的错误风险。 8. **HQL(Hibernate Query Language)**:HQL是Hibernate的专用查询...
Hibernate 支持类的继承映射,可以将继承层次结构映射到数据库的单表或多表。具体有三种策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)和表-per-class-hierarchy(Table per ...
9. **多态性支持**:Hibernate允许在查询时处理不同继承层次的对象,提供了对多态查询的良好支持。 10. **级联操作(Cascading)**:级联操作允许在一个对象的操作中自动处理相关对象,如删除一个实体时,可以选择...
7. **懒加载与立即加载**:探讨Hibernate的懒加载机制,如何避免N+1查询问题,以及何时使用立即加载。 8. **缓存机制**:介绍Hibernate的缓存层次,一级缓存(Session缓存)、二级缓存(SessionFactory缓存)和查询...
Hibernate是一个强大的Java对象关系映射(ORM)框架,它消除了传统SQL编程的繁琐,提供了更高层次的抽象,使我们能够用面向对象的方式处理数据。 1. **SessionFactory接口**: SessionFactory是Hibernate的核心组件...
同时,我们可以利用Hibernate的Criteria API或HQL(Hibernate Query Language)来编写高效的查询,以获取特定层次或路径的节点。 5. **缓存策略**:对于大型树结构,缓存策略的设置至关重要。Hibernate提供了第一级...
5. **CRUD操作**:通过实例展示如何使用Hibernate进行增删查改(Create, Read, Update, Delete)操作,包括对象状态管理、HQL(Hibernate Query Language)查询和Criteria API的使用。 6. **关联映射**:深入探讨一...
10. **多态性支持**:Hibernate支持多态查询,允许在查询中使用继承层次结构中的任何类,使得代码更具扩展性。 11. **延迟加载(Lazy Loading)**:为了提高性能,Hibernate允许关联对象的延迟加载,只有当真正需要...
9. **Association Mapping**:Hibernate支持多种关联映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),使对象间的关联关系能够映射到数据库表的外键关系。 10. **...