‎2025 Sep 26 12:43 PM - edited ‎2025 Sep 29 12:07 PM
Since Hibernate version >= 6.6.0.CR1, SQL statements like the following are generated in certain @ManyToMany configurations:
select null from ... where ...This leads to the following error with the current JDBC driver sapdbc-7.6.11.jar and our MaxDB (full strack trace is attached below):
com.sap.dbtech.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: Cannot convert SQL type CHAR BYTE to Java type int.Is this problem known?
When testing with a different database/driver (H2), the error did not occur, even though select null from ... where ... statements were executed.
If necessary, I can provide test code to reproduce the issue.
Full stack trace:
Hibernate: select null from TestRight tr1_0 where tr1_0.rightid=?
Sep 26, 2025 1:18:04 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: -11214, SQLState: 07006
Sep 26, 2025 1:18:04 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: SAP DBTech JDBC: Cannot convert SQL type CHAR BYTE to Java type int.
Exception in thread "main" jakarta.persistence.RollbackException: Error while committing the transaction
at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:67)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:105)
at hibernatetester.session.CrudTester.main(CrudTester.java:56)
Caused by: org.hibernate.exception.SQLGrammarException: Could not extract column [1] from JDBC ResultSet [SAP DBTech JDBC: Cannot convert SQL type CHAR BYTE to Java type int.] [n/a]
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:91)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:58)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:94)
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.getCurrentRowValue(JdbcValuesResultSetImpl.java:390)
at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.getJdbcValue(RowProcessingStateStandardImpl.java:152)
at org.hibernate.sql.results.graph.basic.BasicResultAssembler.extractRawValue(BasicResultAssembler.java:54)
at org.hibernate.sql.results.graph.basic.BasicResultAssembler.assemble(BasicResultAssembler.java:60)
at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:237)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:183)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:35)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:203)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:82)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:71)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:60)
at org.hibernate.loader.ast.internal.DatabaseSnapshotExecutor.loadDatabaseSnapshot(DatabaseSnapshotExecutor.java:175)
at org.hibernate.loader.ast.internal.SingleIdEntityLoaderSupport.loadDatabaseSnapshot(SingleIdEntityLoaderSupport.java:39)
at org.hibernate.persister.entity.AbstractEntityPersister.getDatabaseSnapshot(AbstractEntityPersister.java:1924)
at org.hibernate.engine.internal.StatefulPersistenceContext.getDatabaseSnapshot(StatefulPersistenceContext.java:316)
at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:330)
at org.hibernate.engine.spi.CascadingActions.isChildTransient(CascadingActions.java:452)
at org.hibernate.engine.spi.CascadingActions$9.cascade(CascadingActions.java:381)
at org.hibernate.engine.spi.CascadingActions$9.cascade(CascadingActions.java:372)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:543)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:465)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:224)
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:577)
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:507)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:468)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:224)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:163)
at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:166)
at org.hibernate.event.internal.AbstractFlushingEventListener.preFlush(AbstractFlushingEventListener.java:104)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:79)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1444)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:506)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2398)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2022)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:439)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:169)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:267)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:102)
... 1 more
Caused by: com.sap.dbtech.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: Cannot convert SQL type CHAR BYTE to Java type int.
at com.sap.dbtech.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:341)
at com.sap.dbtech.jdbc.exceptions.SQLExceptionSapDB.generateSQLException(SQLExceptionSapDB.java:141)
at com.sap.dbtech.jdbc.translators.DBTechTranslator.newGetException(DBTechTranslator.java:1209)
at com.sap.dbtech.jdbc.translators.DBTechTranslator.getInt(DBTechTranslator.java:586)
at com.sap.dbtech.jdbc.ResultSetSapDB.getInt(ResultSetSapDB.java:1112)
at com.sap.dbtech.jdbc.trace.ResultSet.getInt(ResultSet.java:171)
at org.hibernate.type.descriptor.jdbc.IntegerJdbcType$2.doExtract(IntegerJdbcType.java:87)
at org.hibernate.type.descriptor.jdbc.BasicExtractor.extract(BasicExtractor.java:44)
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.getCurrentRowValue(JdbcValuesResultSetImpl.java:382)
... 40 moreEdit:
In the meantime we were able to reproduce the issue with pure JDBC. Following test code leads to the same exception like above:
try (final PreparedStatement st = con.prepareStatement("select null from TestRight",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY))
{
ResultSet result = st.executeQuery();
result.beforeFirst();
while(result.next())
{
System.out.println(result.getInt(1)); // <-- Exception happens here
}
}According to the Javadoc, the getInt(1) call should return 0:
"...Returns: the column value; if the value is SQL NULL, the value returned is 0..."
Instead, however, the com.sap.dbtech.jdbc.exceptions.JDBCDriverException exception is thrown.
I therefore assume it's a bug in the JDBC diver.
Request clarification before answering.
| User | Count |
|---|---|
| 15 | |
| 9 | |
| 6 | |
| 5 | |
| 4 | |
| 4 | |
| 3 | |
| 2 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.