论坛首页 Java版 Hibernate

hibernate3.2下case when语句报错?

浏览 1037 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-09-07
当前开发架构是spring1.2.x+struts1.x+hibernate3.2.x,数据库是oracle9i,我在hibernate的相关类里的hql语句中使用了case when语句,刚开始运行时出现以下错误:
[07-9-7 14:05:38:112 CST] 5e6f774a PARSER        E org.hibernate.hql.PARSER  <AST>:0:0: unexpected AST node: query

[07-9-7 14:05:38:112 CST] 5e6f774a PARSER        E org.hibernate.hql.PARSER  <AST>:0:0: unexpected AST node: query

[07-9-7 14:05:38:127 CST] 5e6f774a RequestProces W org.apache.struts.action.RequestProcessor  Unhandled Exception thrown: class java.lang.NullPointerException

[07-9-7 14:05:38:844 CST] 5e6f774a WebGroup      E SRVE0026E: [Servlet 错误]-[]:java.lang.NullPointerException
	at org.hibernate.hql.ast.tree.CaseNode.getDataType(CaseNode.java:17)
	at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:143)
	at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:705)
	at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:529)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:645)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
	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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
	at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
	at org.springframework.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1205)
	at $Proxy31.createQuery(Unknown Source)
	at com.myproject.hibernate.BaseHibernate$1.doInHibernate(BaseHibernate.java:87)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:336)
	at com.myproject.hibernate.BaseHibernate.getList(BaseHibernate.java:85)
	at com.myproject.hibernate.echeck.InfoRestoreHibernate.getList(InfoRestoreHibernate.java:31)
	at com.myproject.manager.echeck.InfoRestoreManager.getList(InfoRestoreManager.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
	at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:291)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:180)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:147)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:169)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:169)
	at $Proxy19.getList(Unknown Source)


我google了一下,正好也是javaeye的一篇博客,讨论了这个问题,认为是hibernate的工厂类的问题,我按照文章中的,将application*.xml文件修改成了以下形式:
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="mappingResources">
			<list>
				<!-- Add list of .hbm.xml files here -->
				<value>com/myproject/domain/ABC.hbm.xml</value>
                             。。。 。。。
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
				<!-- 下面这行是新增加的 -->
				<prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>				
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.use_outer_join">false</prop>
				<prop key="hibernate.jdbc.fetch_size">50</prop>
				<prop key="hibernate.jdbc.batch_size">25</prop>
			</props>
		</property>
	</bean>

在以上datasource配置部分,原先没有配置hibernate.query.factory_class属性,配置这个属性后,在启动控制台上可以看到加载了此类,按照博客文章的说法,使用ast的工厂类就可以支持case when语句了,但是运行时出现仍然出现的是最开始的错误。
请问是什么缘故导致这个错误,或者怎样配置才是正确的,博客文中似乎只是在hibernate下运行case when语句,而我是在ssh架构下运行hibernate。
   
最后更新时间:2007-09-07
用到case when的hql语句如下:
select pa.portCcSeq,pa.tdBill.portBillSeq,case when(length(pa.yardId) =then '' when(length(pa.yardId) = 12) then (select c.dockName from com.myproject.domain.YardCode c where c.id.yardId = substr(pa.yardId,1,8) and c.id.fieldCode = substr(pa.yardId,9) and pa.customsId = c.id.customsId) end,pa.dealStatus,pa.tdBill.tdShip.portShipSeq,pa.tdBill.billId,pa.tdBill.matchDeclNo from com.myproject.domain.TdCcCmd pa 

这个语句原先没有使用case when语句实现查询,而是查出数据后,在java程序里又根据查出的yardId,循环遍历结果集到yardcode表里取得dockname的
   
0 请登录后投票
最后更新时间:2007-09-10
怎么大家都用不到case when语句么?最后还是发现hibernate不能支持比较复杂的case when语句,如果将 then关键字后面的查询语句改为简单的值,在hql中是可以正确执行的,而then关键字后是查询语句,使用sql在sqlplus中可以执行,hql则出现最上面的错误
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐