`
kingquake21
  • 浏览: 268532 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

优化Hibernate的SQLCriterion_支持同时多表别名

阅读更多
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 );
		}
	}
}
 
分享到:
评论

相关推荐

    Hibernatetools_Reference_Guide

    5. **Ant 集成**:支持通过 Ant 脚本自动化执行 Hibernate 工具的任务。 #### 三、其他相关资源 - **官方文档**:提供了最新的 API 文档和技术指南。 - **社区论坛**:用户可以在社区中寻求帮助或分享经验。 - **...

    GBase_Hibernate3.2.3_GA-Dialect_8.3.81.51_build50.1.jar

    南大通用GBase数据库GBase_Hibernate3.2.3_GA-Dialect_8.3.81.51_build50.1.jar

    Hibernate3.1_DOC_CN.chm

    Hibernate3.1_DOC_CN.chm

    struts_hibernate_bbs.rar_bbs_hibernate b_hibernate bbs_struts hi

    本压缩包"struts_hibernate_bbs.rar"包含了一个使用Struts和Hibernate实现的BBS论坛的源代码,有助于开发者学习和理解这两种技术的集成应用。 Struts是Apache软件基金会下的一个开源MVC(Model-View-Controller)...

    Hibernate3.2官方中文参考手册.pdf 和Hibernate3.1_DOC_CN.chm中文版

    此外,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_项目源码Hibernate3.3.2_项目源码

    bbs.rar_bbs_bbs hibernate_bbs 论坛 系统_hibernate bbs_java BBS

    【标题】"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整合实例Struts2_Hibernate3.2_Spring2.0整合实例

    hibernate_____实现ssh2用的hibernate

    标题 "hibernate_____实现ssh2用的hibernate" 提到的是在SSH2(Struts、Spring、Hibernate)框架中使用Hibernate的情况。SSH2是中国Java Web开发领域中广泛使用的三大开源框架集成,用于构建高效、可扩展的企业级...

    Hibernate_Tools_for_Eclipse插件的安装和使用

    Hibernate_Tools_for_Eclipse插件是 Eclipse 中的一个插件,用于支持 Hibernate 开发。它提供了许多有用的功能,如Hibernate配置文件的创建、实体类的生成、SQL语句的生成等。下面将介绍如何安装和使用 Hibernate_...

    03_传智播客hibernate教程_hibernate入门案例的代码优化

    "03_传智播客hibernate教程_hibernate入门案例的代码优化"主要关注如何通过优化Hibernate代码来提高应用程序的性能和效率。以下是关于Hibernate的一些关键知识点: 1. **Hibernate简介**:Hibernate是Java平台上的...

    01_传智播客hibernate教程_hibernate介绍与动手入门体验

    【标题】"01_传智播客hibernate教程_hibernate介绍与动手入门体验" 涉及的是一门关于Hibernate的初学者教程,旨在帮助开发者了解并掌握这一流行的Java对象关系映射(ORM)框架。Hibernate是Java开发中的一个关键工具...

    Hibernate3.3_学习笔记.doc.zip

    Hibernate支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。理解这些关系如何在映射文件中配置,并能在实际项目中灵活运用,是提升开发效率的关键。 七...

    hibernate_cache_level_1

    总之,“hibernate_cache_level_1”主要关注的是Hibernate的二级缓存机制,通过理解和掌握如何配置、使用以及优化二级缓存,我们可以提升Java应用在处理大数据量时的性能,为用户提供更流畅的体验。

    Hibernate3.1_学习源码

    03 03Hibernate_Component : 实体细粒度的划分,数据库中的一张表在程序中划分为几个部分的实体,配置文件和增、删、改、查的使用。 04 04Hibernate_Composite : 复合主键的使用,在开发中很少用到,一般良好的设计...

    hibernate3.5_lib

    这使得开发者可以选择使用更标准化的API来操作数据库,同时保留Hibernate的强大功能。 3. **Hibernate Tools**:这个组件提供了一系列的开发辅助工具,如Hibernate逆向工程,可以自动生成实体类和映射文件,以及HQL...

    hibernate3.2_src官方源码

    9. **多态和继承**:Hibernate支持类继承关系下的数据库映射,允许在查询时处理多态性。`org.hibernate.tuple.entity.PojoEntityTuplizer`等类展示了这部分功能。 10. **连接池管理**:Hibernate可以与多种连接池...

    api.zip_hibernate api_hibernate api chm

    "hibernate_api" 和 "hibernate_api_chm" 这两个标签明确了文档的主题是关于Hibernate的API,同时再次强调了文档的格式是chm。 **压缩包子文件的文件名称列表:** 列表中的"api.chm"是压缩包内的唯一文件,即...

    hibernatesynchronizer_3.1.9

    《深入理解Hibernate Synchronizer 3.1.9:整合与优化》 Hibernate Synchronizer是一款强大的工具,专为简化Hibernate在Eclipse环境中的配置和管理而设计。它通过自动同步数据库模型与Java实体类,极大地提升了开发...

Global site tag (gtag.js) - Google Analytics