`
ljj
  • 浏览: 13434 次
  • 来自: ...
社区版块
存档分类
最新评论

hibernate 难道不支持case when then end 吗?[已解决,谢谢关注]

阅读更多
hibernate 版本:网上最新的hibernate-3.2.0.ga
执行hql:
select case when c.id>'1' then '111' else '333' END from QuCodeRegion c
报错:
QueryException: undefined alias: case [select case when c.id>'1' then '111' else '333' END from QuCodeRegion c]

如果将case 放到where语名后面,则一切正常.
select c.id  from QuCodeRegion c where case when c.id>'1' then '111' else '333' END='111'
一切正常.
这是为什么,难道hibernate 不支持这种语法.
但hibernate的测试用例里明明有这样的程序(一部分代码):



// $Id: ASTParserLoadingTest.java 9531 2006-03-02 03:14:31Z steve.ebersole@jboss.com $
package org.hibernate.test.hql;

public class ASTParserLoadingTest extends TestCase {

	public ASTParserLoadingTest(String name) {
		super( name );
	}

	public void testSelectClauseCase() {
		Session s = openSession();
		Transaction t = s.beginTransaction();
		Human h = new Human();
		h.setBodyWeight( (float) 74.0 );
		h.setHeight(120.5);
		h.setDescription("Me");
		h.setName( new Name("Gavin", 'A', "King") );
		h.setNickName("Oney");
		s.persist(h);
		String name = (String) s.createQuery("select case nickName when 'Oney' then 'gavin' when 'Turin' then 'christian' else nickName end from Human").uniqueResult();
		assertEquals(name, "gavin");
		String result = (String) s.createQuery("select case when bodyWeight > 100 then 'fat' else 'skinny' end from Human").uniqueResult();
		assertEquals(result, "skinny");
		s.delete(h);
		t.commit();
		s.close();
	}
}



解决办法:
终于发现问题了,配置文件问题.
当查询解析器配置为


代码

<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>


出错
配置为

代码

<property name="org.hibernate.hql.ast.ASTQueryTranslatorFactory"</property>


能正常运行.
怀疑第一个解析器有问题.
感谢:together、BirdGu的帮助!
分享到:
评论
12 楼 Allen 2006-10-24  
ljj 写道
终于发现问题了,配置文件问题.
当查询解析器配置为
 <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>

出错
配置为
 <property name="org.hibernate.hql.ast.ASTQueryTranslatorFactory"</property>

能正常运行.
怀疑第一个解析器有问题.
感谢:together、BirdGu的帮助!

T_T Hibernate默认用的就是AST,先生何苦专门自己指定一下呢?

不过这个问题我还是头一次听说,谢谢分享经验了哈。
11 楼 Allen 2006-10-24  
测试环境:MS Sql Server 2005 Express SP1; Hibernate 3.2.0 GA; Tomcat 5.5.20

我的愚钝的测试代码:(图省事,直接用Spring的HibernateTemplate.find()来测试。到了Hibernate都是session.createQuery(),应该差别不大……)
	String queryStr1 = " select case when m.flag = 1 then 'Valid' else 'Invalid' END from Mobilization m ";
		
	String queryStr2 = " select case when flag = 1 then 'Valid' else 'Invalid' END from Mobilization ";
		
	String queryStr3 = " select case flag when 1 then 'Valid' else 'Invalid' END from Mobilization ";
		
	String queryStr4 = " select case m.flag when 1 then 'Valid' else 'Invalid' END from Mobilization m ";
		
	List list1 = getHibernateTemplate().find(queryStr1);
	for (Iterator it = list1.iterator(); it.hasNext(); ) {
		log.debug(it.next());
	}
		
	List list2 = getHibernateTemplate().find(queryStr2);
	for (Iterator it = list2.iterator(); it.hasNext(); ) {
		log.debug(it.next());
	}
		
	List list3 = getHibernateTemplate().find(queryStr3);
	for (Iterator it = list3.iterator(); it.hasNext(); ) {
		log.debug(it.next());
	}
		
	List list4 = getHibernateTemplate().find(queryStr4);
	for (Iterator it = list4.iterator(); it.hasNext(); ) {
		log.debug(it.next());
	}


控制台的输出:
Hibernate:
    /*  select
        case
            when m.flag = 1 then 'Valid'
            else 'Invalid'
        END
    from
        Mobilization m  */ select
            case
                when mobilizati0_.flag=1 then 'Valid'
                else 'Invalid'
            end as col_0_0_
        from
            Mobilization mobilizati0_
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(255) | Valid
Hibernate:
    /*  select
        case
            when flag = 1 then 'Valid'
            else 'Invalid'
        END
    from
        Mobilization  */ select
            case
                when mobilizati0_.flag=1 then 'Valid'
                else 'Invalid'
            end as col_0_0_
        from
            Mobilization mobilizati0_
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(260) | Valid
Hibernate:
    /*  select
        case flag
            when 1 then 'Valid'
            else 'Invalid'
        END
    from
        Mobilization  */ select
            case mobilizati0_.flag
                when 1 then 'Valid'
                else 'Invalid'
            end as col_0_0_
        from
            Mobilization mobilizati0_
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(265) | Valid
Hibernate:
    /*  select
        case m.flag
            when 1 then 'Valid'
            else 'Invalid'
        END
    from
        Mobilization m  */ select
            case mobilizati0_.flag
                when 1 then 'Valid'
                else 'Invalid'
            end as col_0_0_
        from
            Mobilization mobilizati0_
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Invalid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Valid
[nosense] DEBUG MobilizationHqlCaseTest.getMobByConditions(270) | Valid


目前我的一点结论:
1. 有没有化名(alias)最后生成的SQL语句都是相同的;
2. 暂时没有发现如楼主所说的问题……

注:以上测试在 Hibernate 3.1.3 上面得到的结果完全相同。
10 楼 ljj 2006-10-24  
终于发现问题了,配置文件问题.
当查询解析器配置为
 <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>

出错
配置为
 <property name="org.hibernate.hql.ast.ASTQueryTranslatorFactory"</property>

能正常运行.
怀疑第一个解析器有问题.
感谢:together、BirdGu的帮助!
9 楼 ljj 2006-10-24  
郁闷啊,折腾半天了.
8 楼 BirdGu 2006-10-24  
以下HQL在Hibernate 3.2下能正确执行。

select case when price > 100 then 'high' else 'low' END from Book
7 楼 together 2006-10-24  
嗯,我在用hb2的时候,倒是报的错误和你贴出来的一样。
我的查询方式是query = session.createQuery("select case when c.id>2 then '222' else '333' end from User c");
再报错,只能怪RPWT了。
6 楼 ljj 2006-10-24  
together 写道
我只在使用hibernate2的时候,才发现有这样的错误。
hibernate3.1,3.2都用过了,没问题。

你还是再确认一下版本吧。确认一下引用的可是org.hibernate?


版本应该没问题,以下是完整的错误信息:
Exception in thread "main" org.hibernate.QueryException: undefined alias: case [select case when codeid>'1' then '111' else '333' END from QuCodeRegion]
	at org.hibernate.hql.classic.PathExpressionParser.token(PathExpressionParser.java:130)
	at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
	at org.hibernate.hql.classic.SelectParser.token(SelectParser.java:176)
	at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
	at org.hibernate.hql.classic.ClauseParser.end(ClauseParser.java:113)
	at org.hibernate.hql.classic.PreprocessingParser.end(PreprocessingParser.java:122)
	at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:29)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:192)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:168)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
	at cn.com.cfit.gztfjg.commonMode.BaseDAO.findObj(BaseDAO.java:208)
	at test3.TestCase.main(TestCase.java:13)
5 楼 together 2006-10-24  
我只在使用hibernate2的时候,才发现有这样的错误。
hibernate3.1,3.2都用过了,没问题。

你还是再确认一下版本吧。确认一下引用的可是org.hibernate?
4 楼 ljj 2006-10-24  
together 写道
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。
在hibernate2中,是不支持在select中的case when语句的。
在3.1中是完全可以执行的。

请问你用过吗?在错误提示里,将case,做为alias了.
3 楼 ljj 2006-10-24  
together 写道
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。
在hibernate2中,是不支持在select中的case when语句的。
在3.1中是完全可以执行的。
hibernate 版本:网上最新的hibernate-3.2.0.ga
2 楼 together 2006-10-24  
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。
在hibernate2中,是不支持在select中的case when语句的。
在3.1中是完全可以执行的。
1 楼 Allen 2006-10-24  
引用
select case nickName when 'Oney' then 'gavin' when 'Turin' then 'christian' else nickName end from Human

并没有使用alias...

而在
引用
select c.id from QuCodeRegion c where case when c.id>'1' then '111' else '333' END='111'

中,"c"是"QuCodeRegion"的alias...

相关推荐

    Hibernate 多数据库支持解决方案

    在处理多数据库支持时,Hibernate提供了一些策略和技巧来确保应用程序能够在不同类型的数据库之间灵活切换。以下是一些关键点的详细说明: 1. **去掉数据库级的外键关联** - 在多数据库环境中,由于不同数据库对外...

    hibernate--1.什么是 Hibernate ?

    ORM是Object-Relational Mapping的缩写,它是将关系数据库的数据模型映射到面向对象模型的技术,使得开发者可以使用面向对象的方式来处理数据库操作,而不需要过多关注底层的SQL语法和数据库细节。 Hibernate的核心...

    hibernate显示不带?的完整sql

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数...

    解决hibernate在Myeclipse运行不正常

    解决hibernate在MyeclipseH不能正常运行问题

    Hibernate相关jar包括新版本jdk不兼容旧版本的jar.zip

    这个问题在"Hibernate相关jar包括新版本jdk不兼容旧版本的jar.zip"这个压缩包中被提及,表明其中可能包含了针对这种兼容性问题的解决方案。 首先,我们需要理解为什么新版本的JDK可能导致与Hibernate的不兼容性。...

    Hibernate下数据批量处理解决方案

    然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。以下是一些关于如何在Hibernate环境下优化批量数据处理的策略。 首先,了解问题的根源。在上述例子中,当尝试向...

    达梦 Hibernate 方言 2.0 至 4.0

    《达梦Hibernate方言 2.0 至 4.0》是针对国产数据库达梦在Hibernate框架中的方言应用进行深入探讨的技术资料。Hibernate是一个流行的Java持久化框架,它简化了数据库与应用程序之间的交互,通过对象关系映射(ORM)...

    Hibernate入门到精通

    Hibernate 是一个开源的Java Persistence Framework,它提供了一种对象关系映射的解决方案,帮助开发者轻松地访问和操作关系数据库。Hibernate 的主要特点是:支持多种数据库管理系统、提供了高效的数据访问机制、...

    很不错的Hibernate解决方案.pdf

    在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...

    解决Hibernate中MySQL的中文排序

    在使用Hibernate进行数据库操作时,可能会遇到MySQL数据库中文排序不正确的问题。这通常是由于字符集设置、数据库排序规则以及Hibernate的配置等因素导致的。本文将深入探讨如何解决这些问题,确保MySQL数据库中的...

    Hibernate4.0,Hibernate5.2,Hibernate5.6 jar包

    Hibernate是Java领域中一款广泛应用的关系型数据库对象映射框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库交互。这个压缩包包含了Hibernate的三个不同版本:4.0、5.2和5.6,每个...

    Hibernate Hibernate5 讲义 PDF

    Hibernate是一个开源的对象关系映射(ORM)框架,它封装了JDBC(Java Database Connectivity)的复杂性,并允许Java开发者以面向对象的方式操作数据库。Hibernate框架被广泛应用于企业级Java应用程序中,可以与...

    hibernate入门小程序

    Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务,使得开发人员可以使用面向对象的方式来操作数据库,而无需过多地关注SQL语句的编写。在"hibernate3.2依赖包"中,我们将...

    解决在同一项目中Hibernate与Mybatis共存的问题的解决方案.docx

    Hibernate封装了很多有用的API给开发者,降低了操作数据库的难度和复杂度,同时也减少了模板代码的数量,但Hibernate留给开发者可操作的空间相对Mybatis少了很多。 Mybatis框架使用起来很灵活,开发者可以自定义查询...

    hibernate的中文问题的解决方案

    ### Hibernate中文问题解决方案 在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细...

    hibernate和MySQL的jar

    标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...

    hibernate5.2.9

    Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作数据库。在Hibernate 5.2.9版本中,提供了许多增强的功能和优化,适合初学者进行学习和实践。这个压缩包包含的...

    Beginning Hibernate: For Hibernate 5

    ### 关于《Beginning Hibernate: For Hibernate 5》的知识点总结 #### Hibernate 5 概述 - **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**...

    Hibernate3的依赖包

    10. **增强的性能**:通过延迟加载、批处理和缓存机制,Hibernate能够在不牺牲性能的情况下提供强大的功能。 在Eclipse中使用这些依赖包,你需要按照以下步骤操作: 1. **创建项目**:首先,在Eclipse中创建一个新...

Global site tag (gtag.js) - Google Analytics