cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Error with 'Select null from...': Cannot convert SQL type CHAR BYTE to Java type int.

pk3436
Discoverer
0 Likes
1,670

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 more

Edit:

 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.

Accepted Solutions (0)

Answers (0)