`

hibernate的一个BUG

阅读更多
BUG简单描述:在Criteria联表查询中,Hibernate装组出无效的SQL。
版本:3.25GA,在最新版3.50rc2上BUG存在那个类中未发现有更改。


    下面是简单的示例代码:

    两个类:某类(FlexLink)和组织类(Organization),关系为多对一。

//创建查询器
		DetachedCriteria c = DetachedCriteria.forClass(FlexLink.class, "_link");
		//再创建一个子属性别名
		c.createAlias("_link.organization", "organization");
		//子属性的条件
		c.add(Restrictions.eq("organization.orgName", "xxx"));
		//只查部份属性
		ProjectionList projectionList = Projections.projectionList();
		projectionList.add(Projections.property("organization.orgName").as("organization.orgName"));
		c.setProjection(projectionList);
		//调用SPRING提供的DAO查询
		flexLinkDAO.getHibernateTemplate().findByCriteria(c);
		
		//生成的SQL:
		select
        	organizati1_.ORGANIZATION_NAME as y0_ 
	    from
	        BIS_FLEX_LINK this_ 
	    inner join
	        SYS_ORGANIZATION organizati1_ 
	            on this_.ORGANIZATION_ID=organizati1_.ORGANIZATION_ID 
	    where
	        y0_=?//问题就出在这里,这里可以用organizati1_.ORGANIZATION_NAME=?,但不能用y0_这个别名


    上面的SQL在ORACLE和MYSQL上都是不能执行的,y0_这别名不能用作条件关键字,但是可以用在order by 名子中,如order by y0_。
     那么是哪个类出错了?最直观看到的就是CriteriaQueryTranslator类的getColumnsUsingProjection方法:

/**
	 * Get the names of the columns constrained
	 * by this criterion.
	 * 此方法在criteria查中,把查询对象翻译成SQL时要用到,
	 * 用于取得JAVA属性名对应的SQL的字段名或SQL别名
	 * 在这里,getWhereCondition调用此方法组装where条件
	 */
	public String[] getColumnsUsingProjection(
			Criteria subcriteria,
	        String propertyName) throws HibernateException {

		//first look for a reference to a projection alias
		final Projection projection = rootCriteria.getProjection();
		//就是这一行有问题,就是这里返回了y0_这个别名,这里也不全错,上面说是order by y0_是可以的,
		//Hibernate组装order by 句子的时也要调用此方法,
		String[] projectionColumns = projection == null ?
		                             null :
		                             projection.getColumnAliases( propertyName, 0 );

		if ( projectionColumns == null ) {
			//it does not refer to an alias of a projection,
			//look for a property
			try {
				return getColumns( propertyName, subcriteria );
			}
			catch ( HibernateException he ) {
				//not found in inner query , try the outer query
				if ( outerQueryTranslator != null ) {
					return outerQueryTranslator.getColumnsUsingProjection( subcriteria, propertyName );
				}
				else {
					throw he;
				}
			}
		}
		else {
			//it refers to an alias of a projection
			return projectionColumns;
		}
	}


    改BUG方案:

     方案一,改源码:就把那行有问题的直接改成String[] projectionColumns = null就可以,或者直接保留try catch块就可以了,不影响。
     方案二,避免此问题:此问题的根本原因在于select句中为orgName这个字段建立了别名,所以在组装条件句时才取到别名,那如果select句中不查orgName这个字段就不会有这个问题。

    如果有更好的解决方法,欢迎讨论。
1
0
分享到:
评论

相关推荐

    Hibernate 3.2.4+ bug

    NULL 博文链接:https://imp9527.iteye.com/blog/438677

    hibernate的xml文件bug

    由jbosstools创建xmll文件出现bug

    Hibernate Synchronizer 插件重大缺陷改正

    Hibernate Synchronizer 插件重大缺陷改正

    hibernate连接池.doc

    一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。 二、默认情况下(即没有配置连接...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    NULL 博文链接:https://toshibasony.iteye.com/blog/708026

    深入浅出Hibernate源码

    本下载包与书籍的实战篇紧密结合. 下载包中的程序是一个简明的示例论坛程序,按照循序渐进的原则,分为不同的步骤: 步骤1: ... * 修正了和webwork相关的一个中文bug v1.0 (2005.4.20) * 初始版本

    论坛系统 hibernate jsp hibernate 毕业论文项目

    论坛系统hibernate jsp hibernate 毕业论文项目

    hibernate连接池配置

    一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。 二、默认情况下(即没有配置连接...

    Bug管理系统 struts2+sping2.5+hibernate3(2-2)

    本程序是作者学习struts spring hibernate构架后为了练习开发的一个小程序。开发此程序的目的是为了验证框架技术在项目中的应用。本程序尽量包含了开发当中遇到的一些问题及解决方案。同时欢迎广大网友到作者的群内...

    实现JSP+SERVLET+Hibernate基本分页

    1、可以取消hibernate.cfg.xml中<property name="hbm2ddl.auto">create注释创建表结构 2、可以通过src下的db.sql创建表 V2.0版本更新内容 1、添加struts2.1支持 2、修复没查到数据,组显示负数BUG V1.5版更新内容 1...

    Struts2+hibernate3

    Struts2+hibernate3+mysql+myseclipse 开发项目 常见bug

    hibernate 自连接 emp例子

    hibernate作为底层,通过关系配置,配置Oracle数据库中的EMP表,进行自连接。里面重要的是例子,经过测试的,无bug,放心调试。

    jQuery改写上一个城市的三级联动(解决浏览器兼容bug)

    与上一个三级联动不同的是:上一个项目是使用dom技术编写的整个js代码,存在一定的不足与bug,即浏览器不兼容,只在火狐中有成效,IE、opera、google等都不能兼容。。。到底是哪个模块导致的不兼容,本人目前正在...

    Spring3 MVC +HibernateJPA Eclipse Demo

    1、本示例只是借花献佛,其实网上SpringMVC+...7、附带的另一个附件关于JPQL的学习资料,本示例只提供了CURD四个方法,其他复杂的数据库查询实现需要好好学习JPQL.pdf上的资料 8、写了那么多,希望大家能给我一分

    Hibernate的连接池和数据源配置

    一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。 二、默认情况下(即没有配置连接池...

    Hibernate v3.2中文参考手册

    我们也提供一个JIRA问题追踪系统,来搜集bug报告和新功能请求。如果你对开发Hibernate有兴趣,请加入开发者的邮件列表。(Hibernate网站上的用户论坛有一个中文版面,JavaEye也有Hibernate中文版面,您可以在那里交流...

    Hibernate3.2官方中文参考手册

    我们也提供一个JIRA问题追踪系统,来搜集bug报告和新功能请求。如果你对开发Hibernate有兴趣,请加入开发者的邮件列表。(Hibernate网站上的用户论坛有一个中文版面,JavaEye也有Hibernate中文版面,您可以在那里交流...

    Hibernate教程26_事务并发处理

    http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码

    hibernate-2.1.8.part1.rar

    Bug Reports: Hibernate JIRA (preferred) hibernate-devel@lists.sourceforge.net Free Technical Support: http://forum.hibernate.org Commercial Support & Training: ...

    hibernate-2.1.8.part3.rar

    Bug Reports: Hibernate JIRA (preferred) hibernate-devel@lists.sourceforge.net Free Technical Support: http://forum.hibernate.org Commercial Support & Training: ...

Global site tag (gtag.js) - Google Analytics