精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-24
执行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的帮助! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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... |
|
返回顶楼 | |
发表时间:2006-10-24
和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。 在hibernate2中,是不支持在select中的case when语句的。 在3.1中是完全可以执行的。 |
|
返回顶楼 | |
发表时间:2006-10-24
together 写道 和是否使用alias倒没什么关系
hibernate 版本:网上最新的hibernate-3.2.0.ga
请说明你所使用的hibernate版本。 在hibernate2中,是不支持在select中的case when语句的。 在3.1中是完全可以执行的。 |
|
返回顶楼 | |
发表时间:2006-10-24
together 写道 和是否使用alias倒没什么关系
请说明你所使用的hibernate版本。 在hibernate2中,是不支持在select中的case when语句的。 在3.1中是完全可以执行的。 请问你用过吗?在错误提示里,将case,做为alias了. |
|
返回顶楼 | |
发表时间:2006-10-24
我只在使用hibernate2的时候,才发现有这样的错误。
hibernate3.1,3.2都用过了,没问题。 你还是再确认一下版本吧。确认一下引用的可是org.hibernate? |
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |
发表时间:2006-10-24
嗯,我在用hb2的时候,倒是报的错误和你贴出来的一样。
我的查询方式是query = session.createQuery("select case when c.id>2 then '222' else '333' end from User c"); 再报错,只能怪RPWT了。 |
|
返回顶楼 | |
发表时间:2006-10-24
以下HQL在Hibernate 3.2下能正确执行。
select case when price > 100 then 'high' else 'low' END from Book |
|
返回顶楼 | |
发表时间:2006-10-24
郁闷啊,折腾半天了.
|
|
返回顶楼 | |