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="org.hibernate.hql.ast.ASTQueryTranslatorFactory"</property>
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) | ValidHibernate: /* 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) | ValidHibernate: /* 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) | ValidHibernate: /* 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
<property name="org.hibernate.hql.ast.ASTQueryTranslatorFactory"</property>