浏览 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。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-09-07
用到case when的hql语句如下:
select pa.portCcSeq,pa.tdBill.portBillSeq,case when(length(pa.yardId) = 这个语句原先没有使用case when语句实现查询,而是查出数据后,在java程序里又根据查出的yardId,循环遍历结果集到yardcode表里取得dockname的 |
|
| 返回顶楼 | |
|
最后更新时间:2007-09-10
怎么大家都用不到case when语句么?最后还是发现hibernate不能支持比较复杂的case when语句,如果将 then关键字后面的查询语句改为简单的值,在hql中是可以正确执行的,而then关键字后是查询语句,使用sql在sqlplus中可以执行,hql则出现最上面的错误
|
|
| 返回顶楼 | |


