2017-03-10 41 views
0

我正在将我的应用程序从3.2迁移到5.2.8。除了这个奇怪的例外,我几乎找到了所有的东西。Hibernate迁移3.2到5.2.8:SQLServerException:未设置参数号的值

Caused by: org.hibernate.exception.GenericJDBCException: could not execute statement 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3188) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3067) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3447) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:145) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:586) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:460) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1428) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The value is not set for the parameter number 6. 
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.buildParamTypeDefinitions(SQLServerPreparedStatement.java:260) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.buildPreparedStrings(SQLServerPreparedStatement.java:219) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doPrepExec(SQLServerPreparedStatement.java:612) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:400) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) ~[sqljdbc4.jar!/:?] 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:314) ~[sqljdbc4.jar!/:?] 
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:493) ~[?:?] 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:205) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3188) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3067) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3447) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:145) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:586) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:460) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1428) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final] 

查询是

update TAB_A set COL1=?,COL2=?,COL3=?,COL4=?,COL5=?,COL6=?,COL7=?,COL8=?,COL9=?,COL10=? 
where ID=? and COL1=? 

我看到简单的SELECT语句同样的问题了。

这是一个迁移到5.2的工作应用程序,所以一切工作在3.2。任何想法我错过了什么?请帮忙。

+0

请添加执行该语句的..的hql查询与params设置等。 –

+0

嗨@MaciejKowalski我发布的SQL是由saveOrUpdate(实体)方法生成的。我没有HQL。另外,我今天注意到,如果我在选择的HQL上注释掉setMaxResults,那么就没有问题了。任何想法为什么这种行为改变?但出于性能方面的原因,我需要setMaxResults。 – Nik

回答

0

原来是我身边的用户错误。我在映射文件中定义了一个自定义的UserType,并且在Hibernate升级期间,我留下了新的nullSafeGet/Set未实现。

我怎么想的?调试SQL驱动程序源显示其中一个自定义类型未在预准备语句中设置。

感谢您的所有回应。