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这个字段就不会有这个问题。
如果有更好的解决方法,欢迎讨论。
分享到:
相关推荐
NULL 博文链接:https://imp9527.iteye.com/blog/438677
由jbosstools创建xmll文件出现bug
Hibernate Synchronizer 插件重大缺陷改正
一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。 二、默认情况下(即没有配置连接...
NULL 博文链接:https://toshibasony.iteye.com/blog/708026
本下载包与书籍的实战篇紧密结合. 下载包中的程序是一个简明的示例论坛程序,按照循序渐进的原则,分为不同的步骤: 步骤1: ... * 修正了和webwork相关的一个中文bug v1.0 (2005.4.20) * 初始版本
论坛系统hibernate jsp hibernate 毕业论文项目
一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。 二、默认情况下(即没有配置连接...
本程序是作者学习struts spring 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+mysql+myseclipse 开发项目 常见bug
hibernate作为底层,通过关系配置,配置Oracle数据库中的EMP表,进行自连接。里面重要的是例子,经过测试的,无bug,放心调试。
与上一个三级联动不同的是:上一个项目是使用dom技术编写的整个js代码,存在一定的不足与bug,即浏览器不兼容,只在火狐中有成效,IE、opera、google等都不能兼容。。。到底是哪个模块导致的不兼容,本人目前正在...
1、本示例只是借花献佛,其实网上SpringMVC+...7、附带的另一个附件关于JPQL的学习资料,本示例只提供了CURD四个方法,其他复杂的数据库查询实现需要好好学习JPQL.pdf上的资料 8、写了那么多,希望大家能给我一分
一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。 二、默认情况下(即没有配置连接池...
我们也提供一个JIRA问题追踪系统,来搜集bug报告和新功能请求。如果你对开发Hibernate有兴趣,请加入开发者的邮件列表。(Hibernate网站上的用户论坛有一个中文版面,JavaEye也有Hibernate中文版面,您可以在那里交流...
我们也提供一个JIRA问题追踪系统,来搜集bug报告和新功能请求。如果你对开发Hibernate有兴趣,请加入开发者的邮件列表。(Hibernate网站上的用户论坛有一个中文版面,JavaEye也有Hibernate中文版面,您可以在那里交流...
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
Bug Reports: Hibernate JIRA (preferred) hibernate-devel@lists.sourceforge.net Free Technical Support: http://forum.hibernate.org Commercial Support & Training: ...
Bug Reports: Hibernate JIRA (preferred) hibernate-devel@lists.sourceforge.net Free Technical Support: http://forum.hibernate.org Commercial Support & Training: ...