Criteria rootCr = session.createCriteria(entityClazz);
Criteria subACr = rootCr.createCriteria("subA","a");
Criteria subBCr = rootCr.createCriteria("subB","b");
String sql = "{alias}.root_time > date_add({a}.a_time, interval 20 hour or {b}.b_time > date_add({a}.a_time, interval 20 hour "
rootCr.add(Restrictions.sqlRestriction(sql));
注:date_add函数是MySQL的,无需理会
上面这段代码使用Hibernate3是会报错的,Hibernate只会将{alias}替换成加入了SQLCriterion的Criteria的别名,此处是rootCr,默认为this_,而对于{a}和{b}都无视。在生成的sql中subA和subB表的别名分别为a1_和b2_,所以会报错
修改SQLCriterion的实现可以达到多表别名替换的效果:
import java.util.Iterator;
import org.hibernate.Criteria;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.engine.TypedValue;
import org.hibernate.impl.CriteriaImpl;
import org.hibernate.impl.CriteriaImpl.Subcriteria;
import org.hibernate.type.Type;
import org.hibernate.util.StringHelper;
/**
* Hack the original class
* 2012-04-10
* @author wangzhen
*
*/
public class SQLCriterion implements Criterion {
private static final long serialVersionUID = 561456879784847643L;
private final String sql;
private final TypedValue[] typedValues;
public String toSqlString(
Criteria criteria,
CriteriaQuery criteriaQuery)
throws HibernateException {
CriteriaImpl rootCriteria = null;
if(criteria instanceof CriteriaImpl){
rootCriteria = (CriteriaImpl)criteria;
}else if(criteria instanceof Subcriteria){
rootCriteria = (CriteriaImpl) ((Subcriteria)criteria).getParent();
}else {
throw new HibernateException("暂不支持其他Criteria的实现");
}
Iterator iterateSubcriteria = rootCriteria.iterateSubcriteria();
String tempSql = sql;
//replace subcriterias' alias
while (iterateSubcriteria.hasNext()) {
Subcriteria subCriteria = (Subcriteria) iterateSubcriteria.next();
tempSql = StringHelper.replace( tempSql, "{"+subCriteria.getAlias()+"}", criteriaQuery.getSQLAlias(subCriteria) );
}
return StringHelper.replace( tempSql, "{alias}", criteriaQuery.getSQLAlias(criteria) );
}
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
return typedValues;
}
public String toString() {
return sql;
}
public SQLCriterion(String sql, Object[] values, Type[] types) {
this.sql = sql;
typedValues = new TypedValue[values.length];
for ( int i=0; i<typedValues.length; i++ ) {
typedValues[i] = new TypedValue( types[i], values[i], EntityMode.POJO );
}
}
}
分享到:
相关推荐
5. **Ant 集成**:支持通过 Ant 脚本自动化执行 Hibernate 工具的任务。 #### 三、其他相关资源 - **官方文档**:提供了最新的 API 文档和技术指南。 - **社区论坛**:用户可以在社区中寻求帮助或分享经验。 - **...
南大通用GBase数据库GBase_Hibernate3.2.3_GA-Dialect_8.3.81.51_build50.1.jar
Hibernate3.1_DOC_CN.chm
本压缩包"struts_hibernate_bbs.rar"包含了一个使用Struts和Hibernate实现的BBS论坛的源代码,有助于开发者学习和理解这两种技术的集成应用。 Struts是Apache软件基金会下的一个开源MVC(Model-View-Controller)...
此外,3.2版还增强了对EJB3的支持,提升了性能,并优化了查询语言HQL(Hibernate Query Language)和 Criteria 查询。HQL是Hibernate特有的面向对象的查询语言,类似于SQL,但操作的是对象而不是表格。Criteria查询...
Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码
【标题】"bbs.rar_bbs_bbs hibernate_bbs 论坛 系统_hibernate bbs_java BBS" 指的是一个基于Java技术栈,特别是使用了Struts、Hibernate和Spring框架开发的BBS(Bulletin Board System,论坛)系统。这个系统不仅...
Struts2_Hibernate3.2_Spring2.0整合实例Struts2_Hibernate3.2_Spring2.0整合实例Struts2_Hibernate3.2_Spring2.0整合实例Struts2_Hibernate3.2_Spring2.0整合实例Struts2_Hibernate3.2_Spring2.0整合实例
标题 "hibernate_____实现ssh2用的hibernate" 提到的是在SSH2(Struts、Spring、Hibernate)框架中使用Hibernate的情况。SSH2是中国Java Web开发领域中广泛使用的三大开源框架集成,用于构建高效、可扩展的企业级...
Hibernate_Tools_for_Eclipse插件是 Eclipse 中的一个插件,用于支持 Hibernate 开发。它提供了许多有用的功能,如Hibernate配置文件的创建、实体类的生成、SQL语句的生成等。下面将介绍如何安装和使用 Hibernate_...
"03_传智播客hibernate教程_hibernate入门案例的代码优化"主要关注如何通过优化Hibernate代码来提高应用程序的性能和效率。以下是关于Hibernate的一些关键知识点: 1. **Hibernate简介**:Hibernate是Java平台上的...
【标题】"01_传智播客hibernate教程_hibernate介绍与动手入门体验" 涉及的是一门关于Hibernate的初学者教程,旨在帮助开发者了解并掌握这一流行的Java对象关系映射(ORM)框架。Hibernate是Java开发中的一个关键工具...
Hibernate支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。理解这些关系如何在映射文件中配置,并能在实际项目中灵活运用,是提升开发效率的关键。 七...
总之,“hibernate_cache_level_1”主要关注的是Hibernate的二级缓存机制,通过理解和掌握如何配置、使用以及优化二级缓存,我们可以提升Java应用在处理大数据量时的性能,为用户提供更流畅的体验。
03 03Hibernate_Component : 实体细粒度的划分,数据库中的一张表在程序中划分为几个部分的实体,配置文件和增、删、改、查的使用。 04 04Hibernate_Composite : 复合主键的使用,在开发中很少用到,一般良好的设计...
这使得开发者可以选择使用更标准化的API来操作数据库,同时保留Hibernate的强大功能。 3. **Hibernate Tools**:这个组件提供了一系列的开发辅助工具,如Hibernate逆向工程,可以自动生成实体类和映射文件,以及HQL...
9. **多态和继承**:Hibernate支持类继承关系下的数据库映射,允许在查询时处理多态性。`org.hibernate.tuple.entity.PojoEntityTuplizer`等类展示了这部分功能。 10. **连接池管理**:Hibernate可以与多种连接池...
"hibernate_api" 和 "hibernate_api_chm" 这两个标签明确了文档的主题是关于Hibernate的API,同时再次强调了文档的格式是chm。 **压缩包子文件的文件名称列表:** 列表中的"api.chm"是压缩包内的唯一文件,即...
《深入理解Hibernate Synchronizer 3.1.9:整合与优化》 Hibernate Synchronizer是一款强大的工具,专为简化Hibernate在Eclipse环境中的配置和管理而设计。它通过自动同步数据库模型与Java实体类,极大地提升了开发...