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的帮助!
分享到:
相关推荐
sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the ...
@Formula("CASE WHEN gender = 'F' THEN 'Ms.' ELSE 'Mr.' END") private String title; ``` #### @Version - **用途**:用于实现乐观锁机制。 - **示例**: ```java @Version private int version; ``` #...
String hql = "SELECT CASE WHEN c.age > 5 THEN 'old' ELSE 'young' END AS ageDesc FROM Cat c"; List, Object>> list = session.createQuery(hql).list(); ``` 使用`CASE WHEN...THEN...ELSE...END`可以在...
- Oracle的DECODE函数在DB2中不支持,可以使用CASE WHEN语句替代,如`SELECT CASE WHEN f_areaid IS NULL THEN '空' ELSE f_areaid END FROM masa_user`。 7. **NVL函数**: - Oracle的NVL在DB2中需要使用...
SELECT CASE WHEN A > B THEN A ELSE B END AS MaxCol FROM table; ``` - 当 B 列大于 C 列时选择 B 列,否则选择 C 列: ```sql SELECT CASE WHEN B > C THEN B ELSE C END AS MaxCol FROM table; ``` #### ...
- 统计x字段不同情况的个数,以及输出条数大于200的情况:`SELECT COUNT(DISTINCT x) AS distinct_count, SUM(CASE WHEN count(x) > 200 THEN 1 ELSE 0 END) AS more_than_200 FROM (SELECT x, COUNT(*) FROM A ...
SELECT * FROM 表名 ORDER BY CASE WHEN IFNULL(字段名, '') = '' THEN 0 ELSE 1 END, 字段名 DESC; ``` 4. **合并列值**:在MySQL中,可以使用`GROUP_CONCAT(字段名 SEPARATOR 分隔符)`函数将多行数据的某个字段...