1.异常信息显示
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2147)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
at org.hibernate.loader.Loader.list(Loader.java:2023)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:780)
at org.jbpm.pvm.internal.query.AbstractQuery.execute(AbstractQuery.java:93)
at org.jbpm.pvm.internal.query.TaskQueryImpl.execute(TaskQueryImpl.java:231)
at org.jbpm.pvm.internal.query.AbstractQuery.execute(AbstractQuery.java:83)
at org.jbpm.pvm.internal.svc.DefaultCommandService.execute(DefaultCommandService.java:42)
at org.jbpm.pvm.internal.svc.SkipInterceptor.execute(SkipInterceptor.java:40)
at org.jbpm.pvm.internal.query.AbstractQuery.untypedUniqueResult(AbstractQuery.java:74)
at org.jbpm.pvm.internal.query.TaskQueryImpl.uniqueResult(TaskQueryImpl.java:259)
Caused by: java.sql.SQLException: ORA-01722: 无效数字
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1054)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:836)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1668)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2144)
... 93 more
2.问题分析
从“Caused by: java.sql.SQLException: ORA-01722: 无效数字“这个异常信息可以看出,是在sql查询时,where后面的条件本来是数字类型,但是赋值时为字符串类型导致的,经过debbug跟踪查看,导致到问题的原因是在org.jbpm.pvm.internal.query.TaskQueryImpl.execute方法中的hql语句select task from TaskImpl task where task.processInstance.id=‘PD...........’,不同的hibernate版本翻译成的sql语句不同,只有在hibernate3.2.2以上的版本中,翻译的语句才是正确的,所以一定要确保在集成JBPM4.4的项目中的hibernate版本是3.2.2以上的版本。
但是在把hibernate3.2.3的jar替换添加到项目的lib中后,发布到JBOSS4.0.5上,启动发现还是报以上的错误,这时就要想想了,应该是在哪个地方还是有hibernate3.2.2或者以下的包存在,所以就想到是JBOSS容器自身的lib中,查看server\default\lib中hibernate的jar的版本,发现JBOSS4.0.5的这个版本中的jar是3.2.0的,根据JBOSS容器的classpath的加载优先级别,jboss的核心jar和server\default\lib中的jar优先于war中的jar加载,所以实际使用的还是hibernate3.2.0的jar。
3.问题解决
替换项目war中的web-inf\lib中的hibernate中的jar,确保为hibernate3.2.3或者以上的版本。
替换JBOSS4.0.5server\default\lib中的hibernate的jar,确保为hibernate3.2.3或者以上的版本。
4.补充说明
由于在JBOSS4不同版本中,hibernate的版本不同,所以在JBOSS4中发布JBPM4.4的项目,一定要检查JBOSS自带的hibernate的jar的版本。或者一次性到位将JBOSS换成JBOSS4.2.3的版本,里面带的hibernate为3.2.4的版本。