论坛首页 Java企业应用论坛

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

浏览 13242 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-24  
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的帮助!
   发表时间: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...
0 请登录后投票
   发表时间:2006-10-24  
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。
在hibernate2中,是不支持在select中的case when语句的。
在3.1中是完全可以执行的。
0 请登录后投票
   发表时间:2006-10-24  
together 写道
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。
在hibernate2中,是不支持在select中的case when语句的。
在3.1中是完全可以执行的。
hibernate 版本:网上最新的hibernate-3.2.0.ga
0 请登录后投票
   发表时间:2006-10-24  
together 写道
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。
在hibernate2中,是不支持在select中的case when语句的。
在3.1中是完全可以执行的。

请问你用过吗?在错误提示里,将case,做为alias了.
0 请登录后投票
   发表时间:2006-10-24  
我只在使用hibernate2的时候,才发现有这样的错误。
hibernate3.1,3.2都用过了,没问题。

你还是再确认一下版本吧。确认一下引用的可是org.hibernate?
0 请登录后投票
   发表时间: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)
0 请登录后投票
   发表时间:2006-10-24  
嗯,我在用hb2的时候,倒是报的错误和你贴出来的一样。
我的查询方式是query = session.createQuery("select case when c.id>2 then '222' else '333' end from User c");
再报错,只能怪RPWT了。
0 请登录后投票
   发表时间:2006-10-24  
以下HQL在Hibernate 3.2下能正确执行。

select case when price > 100 then 'high' else 'low' END from Book
0 请登录后投票
   发表时间:2006-10-24  
郁闷啊,折腾半天了.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics