diff --git a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java index b997ee5820..532fe29e31 100644 --- a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java @@ -182,72 +182,77 @@ public class OutputsImpl implements Outputs { executionContext ); - //noinspection unchecked - final RowReader rowReader = (RowReader) ResultsHelper.createRowReader( - executionContext, - null, - RowTransformerStandardImpl.INSTANCE, - null, - jdbcValues - ); - - /* - * Processing options effectively are only used for entity loading. Here we don't need these values. - */ - final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions() { - @Override - public Object getEffectiveOptionalObject() { - return null; - } - - @Override - public String getEffectiveOptionalEntityName() { - return null; - } - - @Override - public Serializable getEffectiveOptionalId() { - return null; - } - - @Override - public boolean shouldReturnProxies() { - return true; - } - }; - - final JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState = - new JdbcValuesSourceProcessingStateStandardImpl( - executionContext, - processingOptions - ); - final ArrayList results = new ArrayList<>(); try { - final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl( - jdbcValuesSourceProcessingState, + //noinspection unchecked + final RowReader rowReader = (RowReader) ResultsHelper.createRowReader( executionContext, - rowReader, + null, + RowTransformerStandardImpl.INSTANCE, + null, jdbcValues ); - while ( rowProcessingState.next() ) { - results.add( rowReader.readRow( rowProcessingState, processingOptions ) ); - rowProcessingState.finishRowProcessing(); + /* + * Processing options effectively are only used for entity loading. Here we don't need these values. + */ + final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions() { + @Override + public Object getEffectiveOptionalObject() { + return null; + } + + @Override + public String getEffectiveOptionalEntityName() { + return null; + } + + @Override + public Serializable getEffectiveOptionalId() { + return null; + } + + @Override + public boolean shouldReturnProxies() { + return true; + } + }; + + final JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState = + new JdbcValuesSourceProcessingStateStandardImpl( + executionContext, + processingOptions + ); + final ArrayList results = new ArrayList<>(); + try { + final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl( + jdbcValuesSourceProcessingState, + executionContext, + rowReader, + jdbcValues + ); + + while ( rowProcessingState.next() ) { + results.add( rowReader.readRow( rowProcessingState, processingOptions ) ); + rowProcessingState.finishRowProcessing(); + } + if ( resultSetMapping.getNumberOfResultBuilders() == 0 + && procedureCall.isFunctionCall() + && procedureCall.getFunctionReturn().getJdbcTypeCode() == Types.REF_CURSOR + && results.size() == 1 + && results.get( 0 ) instanceof ResultSet ) { + // When calling a function that returns a ref_cursor with as table function, + // we have to unnest the ResultSet manually here + return extractResults( (ResultSet) results.get( 0 ) ); + } + return results; } - if ( resultSetMapping.getNumberOfResultBuilders() == 0 - && procedureCall.isFunctionCall() - && procedureCall.getFunctionReturn().getJdbcTypeCode() == Types.REF_CURSOR - && results.size() == 1 - && results.get( 0 ) instanceof ResultSet ) { - // When calling a function that returns a ref_cursor with as table function, - // we have to unnest the ResultSet manually here - return extractResults( (ResultSet) results.get( 0 ) ); + finally { + rowReader.finishUp( jdbcValuesSourceProcessingState ); + jdbcValuesSourceProcessingState.finishUp( results.size() > 1 ); + jdbcValues.finishUp( this.context.getSession() ); } - return results; } finally { - rowReader.finishUp( jdbcValuesSourceProcessingState ); - jdbcValuesSourceProcessingState.finishUp( results.size() > 1 ); jdbcValues.finishUp( this.context.getSession() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java index d84a8d5031..4ec2c07eb0 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java @@ -253,7 +253,6 @@ public class DeferredResultSetAccess extends AbstractResultSetAccess { skipRows( resultSet ); logicalConnection.getResourceRegistry().register( resultSet, preparedStatement ); - } catch (SQLException e) { try { @@ -267,9 +266,6 @@ public class DeferredResultSetAccess extends AbstractResultSetAccess { "JDBC exception executing SQL [" + finalSql + "]" ); } - finally { - logicalConnection.afterStatement(); - } } private JdbcSessionContext context() { @@ -324,20 +320,18 @@ public class DeferredResultSetAccess extends AbstractResultSetAccess { @Override public void release() { + final LogicalConnectionImplementor logicalConnection = getPersistenceContext().getJdbcCoordinator() + .getLogicalConnection(); if ( resultSet != null ) { - getPersistenceContext().getJdbcCoordinator() - .getLogicalConnection() - .getResourceRegistry() - .release( resultSet, preparedStatement ); + logicalConnection.getResourceRegistry().release( resultSet, preparedStatement ); resultSet = null; } if ( preparedStatement != null ) { - getPersistenceContext().getJdbcCoordinator() - .getLogicalConnection() - .getResourceRegistry() - .release( preparedStatement ); + logicalConnection.getResourceRegistry().release( preparedStatement ); preparedStatement = null; } + + logicalConnection.afterStatement(); } }