Hello, there is an issue with spring boot 3.4.0 when returning a jpa Stream response and return it into a body from a Controller. With Spring Boot 3.3.5 it worked all fine.
My demo application uses: - kotlin 2 - postgres 17 - JPA repository returning a Stream - demo entity - simple controller returning the Stream (directly or as Flux; both the same error)
The error message is (translated):
o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 55000
o.h.engine.jdbc.spi.SqlExceptionHelper : The ResultSet has been closed.
o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] threw exception
Thrown Exception Stacktrace
org.postgresql.util.PSQLException: Dieses ResultSet ist geschlossen.
at org.postgresql.jdbc.PgResultSet.checkClosed(PgResultSet.java:3251) ~[postgresql-42.7.4.jar:42.7.4]
at org.postgresql.jdbc.PgResultSet.next(PgResultSet.java:2272) ~[postgresql-42.7.4.jar:42.7.4]
at com.zaxxer.hikari.pool.HikariProxyResultSet.next(HikariProxyResultSet.java) ~[HikariCP-5.1.0.jar:na]
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:270) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:150) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]
at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]
at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:99) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]
at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:51) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]
at org.hibernate.query.internal.ScrollableResultsIterator.hasNext(ScrollableResultsIterator.java:33) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]
at java.base/java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1949) ~[na:na]
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292) ~[na:na]
at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206) ~[na:na]
at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161) ~[na:na]
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298) ~[na:na]
at reactor.core.publisher.FluxIterable$IterableSubscription.hasNext(FluxIterable.java:271) ~[reactor-core-3.7.0.jar:3.7.0]
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:187) ~[reactor-core-3.7.0.jar:3.7.0]
at reactor.core.publisher.FluxStream.subscribe(FluxStream.java:69) ~[reactor-core-3.7.0.jar:3.7.0]
at reactor.core.publisher.Flux.subscribe(Flux.java:8891) ~[reactor-core-3.7.0.jar:3.7.0]
at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler$DeferredResultSubscriber.connect(ReactiveTypeHandler.java:495) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler.handleValue(ReactiveTypeHandler.java:185) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler.handleReturnValue(ResponseBodyEmitterReturnValueHandler.java:210) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:978) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.0.jar:6.2.0]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.0.jar:6.2.0]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.33.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.0.jar:6.2.0]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.33.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.0.jar:6.2.0]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.0.jar:6.2.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.0.jar:6.2.0]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.0.jar:6.2.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.0.jar:6.2.0]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.0.jar:6.2.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
Important code snippets:
Repository
interface DemoRepository : JpaRepository<DemoEntity, Long> {
fun findAllBy(): Stream<DemoEntity>
}
Service
@Component
class DemoService(
private val demoRepository: DemoRepository,
) {
fun getDemoModels() = demoRepository.findAllBy()
}
Controller
@RestController
class DemoController(
private val demoService: DemoService,
) {
data class DemoModelDto(
val id: Long,
val dtoString: String,
)
@GetMapping("/demo")
@Transactional(readOnly = true)
fun getDemoModels(): Flux<DemoModelDto> {
val dtoStream = demoService.getDemoModels().map { t -> DemoModelDto(t.id!!, t.aString) }
return Flux.fromStream(dtoStream)
}
}
Full demo project zip as attachment to reproduce the issue. demo.zip Edit: reuploaded demo.zip
I was trying to prevent this by moving the @Transactional annotation or change the result back to Stream (which also worked with spring boot 3.3.5). But I was not successful.
I could not find any migration hint in the hibernate changelog nor in the spring boot changelog.
Comment From: wilkinsona
Thanks for the sample. The change in behavior is due to a change in Hibernate 6.6. You can see it fail with Spring Boot 3.3.x if you override the Hibernate version to upgrade it to 6.6.x.
Hibernate's logging shows the difference in behavior when the transaction for getDemoModels commits. With Hibernate 6.5:
2024-12-04T14:21:00.122Z DEBUG 19785 --- [demo] [nio-8080-exec-1] o.h.e.t.internal.TransactionImpl : committing
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#beforeCompletionCallback
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] org.hibernate.internal.SessionImpl : SessionImpl#beforeTransactionCompletion()
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#beforeTransactionCompletion
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Preparing to commit transaction via JDBC Connection.commit()
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Transaction committed via JDBC Connection.commit()
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : re-enabling auto-commit on JDBC Connection after completion of JDBC-based transaction
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#afterTransaction
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing JDBC resources
2024-12-04T14:21:00.122Z TRACE 19785 --- [demo] [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterCompletionCallback(true)
And with 6.6:
2024-12-04T14:19:21.848Z DEBUG 19612 --- [demo] [nio-8080-exec-1] o.h.e.t.internal.TransactionImpl : committing
2024-12-04T14:19:21.848Z TRACE 19612 --- [demo] [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#beforeCompletionCallback
2024-12-04T14:19:21.848Z TRACE 19612 --- [demo] [nio-8080-exec-1] org.hibernate.internal.SessionImpl : SessionImpl#beforeTransactionCompletion()
2024-12-04T14:19:21.848Z TRACE 19612 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#beforeTransactionCompletion
2024-12-04T14:19:21.848Z TRACE 19612 --- [demo] [nio-8080-exec-1] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion
2024-12-04T14:19:21.849Z TRACE 19612 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Preparing to commit transaction via JDBC Connection.commit()
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Transaction committed via JDBC Connection.commit()
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : re-enabling auto-commit on JDBC Connection after completion of JDBC-based transaction
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#afterTransaction
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing JDBC resources
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl : Closing result set [HikariProxyResultSet@468254053 wrapping org.postgresql.jdbc.PgResultSet@4a6516ac]
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl : Closing prepared statement [HikariProxyPreparedStatement@242222228 wrapping select de1_0.id,de1_0.astring,de1_0.version from demo de1_0]
2024-12-04T14:19:21.850Z TRACE 19612 --- [demo] [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterCompletionCallback(true)
Note that ResourceRegistryStandardImpl closes the result set and prepared statement in Hibernate 6.6 but did not do so in 6.5. This appears to be the case because the query is executed earlier in 6.6.
With 6.6 it happens during the call to the JPA repository:
executeQuery:229, DeferredResultSetAccess (org.hibernate.sql.results.jdbc.internal)
getResultSet:171, DeferredResultSetAccess (org.hibernate.sql.results.jdbc.internal)
<init>:74, JdbcValuesResultSetImpl (org.hibernate.sql.results.jdbc.internal)
resolveJdbcValuesSource:355, JdbcSelectExecutorStandardImpl (org.hibernate.sql.exec.internal)
doExecuteQuery:137, JdbcSelectExecutorStandardImpl (org.hibernate.sql.exec.internal)
executeQuery:102, JdbcSelectExecutorStandardImpl (org.hibernate.sql.exec.internal)
scroll:195, JdbcSelectExecutor (org.hibernate.sql.exec.spi)
lambda$new$2:187, ConcreteSqmSelectQueryPlan (org.hibernate.query.sqm.internal)
interpret:-1, ConcreteSqmSelectQueryPlan$$Lambda$1749/0x000000012a990628 (org.hibernate.query.sqm.internal)
withCacheableSqmInterpretation:442, ConcreteSqmSelectQueryPlan (org.hibernate.query.sqm.internal)
performScroll:370, ConcreteSqmSelectQueryPlan (org.hibernate.query.sqm.internal)
doScroll:456, QuerySqmImpl (org.hibernate.query.sqm.internal)
scroll:235, AbstractSelectionQuery (org.hibernate.query.spi)
stream:252, AbstractSelectionQuery (org.hibernate.query.spi)
getResultStream:246, AbstractSelectionQuery (org.hibernate.query.spi)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:569, Method (java.lang.reflect)
invokeMethod:281, ReflectionUtils (org.springframework.util)
invokeMethod:265, ReflectionUtils (org.springframework.util)
doExecute:395, JpaQueryExecution$StreamExecution (org.springframework.data.jpa.repository.query)
execute:93, JpaQueryExecution (org.springframework.data.jpa.repository.query)
doExecute:152, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
execute:140, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
invoke:-1, RepositoryMethodInvoker$RepositoryQueryMethodInvoker$$Lambda$1735/0x000000012a96d000 (org.springframework.data.repository.core.support)
doInvoke:170, RepositoryMethodInvoker (org.springframework.data.repository.core.support)
invoke:158, RepositoryMethodInvoker (org.springframework.data.repository.core.support)
doInvoke:169, QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
invoke:148, QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:70, DefaultMethodInvokingMethodInterceptor (org.springframework.data.projection)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:-1, TransactionInterceptor$$Lambda$1728/0x000000012a96a350 (org.springframework.transaction.interceptor)
invokeWithinTransaction:379, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:119, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:138, PersistenceExceptionTranslationInterceptor (org.springframework.dao.support)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:57, SurroundingTransactionDetectorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:136, CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor (org.springframework.data.jpa.repository.support)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:97, ExposeInvocationInterceptor (org.springframework.aop.interceptor)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:95, MethodInvocationValidator (org.springframework.data.repository.core.support)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:223, JdkDynamicAopProxy (org.springframework.aop.framework)
findAllBy:-1, $Proxy128 (jdk.proxy2)
getDemoModels:9, DemoService (com.example.demo)
getDemoModels:21, DemoController (com.example.demo)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:569, Method (java.lang.reflect)
invokeJoinpointUsingReflection:355, AopUtils (org.springframework.aop.support)
invokeJoinpoint:196, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceed:163, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceed:768, CglibAopProxy$CglibMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:-1, TransactionInterceptor$$Lambda$1728/0x000000012a96a350 (org.springframework.transaction.interceptor)
invokeWithinTransaction:379, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:119, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:184, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceed:768, CglibAopProxy$CglibMethodInvocation (org.springframework.aop.framework)
intercept:720, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework)
getDemoModels:-1, DemoController$$SpringCGLIB$$0 (com.example.demo)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:569, Method (java.lang.reflect)
callMethod:97, CallerImpl$Method (kotlin.reflect.jvm.internal.calls)
call:113, CallerImpl$Method$Instance (kotlin.reflect.jvm.internal.calls)
lambda 'reflectionCall' in 'callDefaultMethod':207, KCallableImpl (kotlin.reflect.jvm.internal)
reflectionCall:228, KCallableImpl (kotlin.reflect.jvm.internal)
callDefaultMethod$kotlin_reflection:206, KCallableImpl (kotlin.reflect.jvm.internal)
callBy:112, KCallableImpl (kotlin.reflect.jvm.internal)
invokeFunction:334, InvocableHandlerMethod$KotlinDelegate (org.springframework.web.method.support)
doInvoke:252, InvocableHandlerMethod (org.springframework.web.method.support)
invokeForRequest:188, InvocableHandlerMethod (org.springframework.web.method.support)
invokeAndHandle:118, ServletInvocableHandlerMethod (org.springframework.web.servlet.mvc.method.annotation)
invokeHandlerMethod:926, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)
handleInternal:831, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)
handle:87, AbstractHandlerMethodAdapter (org.springframework.web.servlet.mvc.method)
doDispatch:1089, DispatcherServlet (org.springframework.web.servlet)
doService:979, DispatcherServlet (org.springframework.web.servlet)
processRequest:1014, FrameworkServlet (org.springframework.web.servlet)
doGet:903, FrameworkServlet (org.springframework.web.servlet)
service:564, HttpServlet (jakarta.servlet.http)
service:885, FrameworkServlet (org.springframework.web.servlet)
service:658, HttpServlet (jakarta.servlet.http)
internalDoFilter:195, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilter:51, WsFilter (org.apache.tomcat.websocket.server)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:100, RequestContextFilter (org.springframework.web.filter)
doFilter:116, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:93, FormContentFilter (org.springframework.web.filter)
doFilter:116, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:201, CharacterEncodingFilter (org.springframework.web.filter)
doFilter:116, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
invoke:167, StandardWrapperValve (org.apache.catalina.core)
invoke:90, StandardContextValve (org.apache.catalina.core)
invoke:483, AuthenticatorBase (org.apache.catalina.authenticator)
invoke:115, StandardHostValve (org.apache.catalina.core)
invoke:93, ErrorReportValve (org.apache.catalina.valves)
invoke:74, StandardEngineValve (org.apache.catalina.core)
service:344, CoyoteAdapter (org.apache.catalina.connector)
service:397, Http11Processor (org.apache.coyote.http11)
process:63, AbstractProcessorLight (org.apache.coyote)
process:905, AbstractProtocol$ConnectionHandler (org.apache.coyote)
doRun:1741, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net)
run:52, SocketProcessorBase (org.apache.tomcat.util.net)
runWorker:1190, ThreadPoolExecutor (org.apache.tomcat.util.threads)
run:659, ThreadPoolExecutor$Worker (org.apache.tomcat.util.threads)
run:63, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads)
run:840, Thread (java.lang)
With Hibernate 6.5 it happens latter when the result returned by the controller method is being handled:
executeQuery:229, DeferredResultSetAccess (org.hibernate.sql.results.jdbc.internal)
getResultSet:167, DeferredResultSetAccess (org.hibernate.sql.results.jdbc.internal)
advanceNext:265, JdbcValuesResultSetImpl (org.hibernate.sql.results.jdbc.internal)
processNext:145, JdbcValuesResultSetImpl (org.hibernate.sql.results.jdbc.internal)
next:19, AbstractJdbcValues (org.hibernate.sql.results.jdbc.internal)
next:67, RowProcessingStateStandardImpl (org.hibernate.sql.results.internal)
next:51, ScrollableResultsImpl (org.hibernate.internal)
hasNext:33, ScrollableResultsIterator (org.hibernate.query.internal)
tryAdvance:1855, Spliterators$IteratorSpliterator (java.util)
lambda$initPartialTraversalState$0:292, StreamSpliterators$WrappingSpliterator (java.util.stream)
getAsBoolean:-1, StreamSpliterators$WrappingSpliterator$$Lambda$212/0x00000001290b1278 (java.util.stream)
fillBuffer:206, StreamSpliterators$AbstractWrappingSpliterator (java.util.stream)
doAdvance:161, StreamSpliterators$AbstractWrappingSpliterator (java.util.stream)
tryAdvance:298, StreamSpliterators$WrappingSpliterator (java.util.stream)
hasNext:271, FluxIterable$IterableSubscription (reactor.core.publisher)
subscribe:187, FluxIterable (reactor.core.publisher)
subscribe:69, FluxStream (reactor.core.publisher)
subscribe:8848, Flux (reactor.core.publisher)
connect:466, ReactiveTypeHandler$DeferredResultSubscriber (org.springframework.web.servlet.mvc.method.annotation)
handleValue:163, ReactiveTypeHandler (org.springframework.web.servlet.mvc.method.annotation)
handleReturnValue:154, ResponseBodyEmitterReturnValueHandler (org.springframework.web.servlet.mvc.method.annotation)
handleReturnValue:78, HandlerMethodReturnValueHandlerComposite (org.springframework.web.method.support)
invokeAndHandle:136, ServletInvocableHandlerMethod (org.springframework.web.servlet.mvc.method.annotation)
invokeHandlerMethod:926, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)
handleInternal:831, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)
handle:87, AbstractHandlerMethodAdapter (org.springframework.web.servlet.mvc.method)
doDispatch:1089, DispatcherServlet (org.springframework.web.servlet)
doService:979, DispatcherServlet (org.springframework.web.servlet)
processRequest:1014, FrameworkServlet (org.springframework.web.servlet)
doGet:903, FrameworkServlet (org.springframework.web.servlet)
service:564, HttpServlet (jakarta.servlet.http)
service:885, FrameworkServlet (org.springframework.web.servlet)
service:658, HttpServlet (jakarta.servlet.http)
internalDoFilter:195, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilter:51, WsFilter (org.apache.tomcat.websocket.server)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:100, RequestContextFilter (org.springframework.web.filter)
doFilter:116, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:93, FormContentFilter (org.springframework.web.filter)
doFilter:116, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:201, CharacterEncodingFilter (org.springframework.web.filter)
doFilter:116, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:164, ApplicationFilterChain (org.apache.catalina.core)
doFilter:140, ApplicationFilterChain (org.apache.catalina.core)
invoke:167, StandardWrapperValve (org.apache.catalina.core)
invoke:90, StandardContextValve (org.apache.catalina.core)
invoke:483, AuthenticatorBase (org.apache.catalina.authenticator)
invoke:115, StandardHostValve (org.apache.catalina.core)
invoke:93, ErrorReportValve (org.apache.catalina.valves)
invoke:74, StandardEngineValve (org.apache.catalina.core)
service:344, CoyoteAdapter (org.apache.catalina.connector)
service:397, Http11Processor (org.apache.coyote.http11)
process:63, AbstractProcessorLight (org.apache.coyote)
process:905, AbstractProtocol$ConnectionHandler (org.apache.coyote)
doRun:1741, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net)
run:52, SocketProcessorBase (org.apache.tomcat.util.net)
runWorker:1190, ThreadPoolExecutor (org.apache.tomcat.util.threads)
run:659, ThreadPoolExecutor$Worker (org.apache.tomcat.util.threads)
run:63, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads)
run:840, Thread (java.lang)
I don't think there's anything we can do about this in Spring Boot. I'm not sure if it might be possible to tolerate Hibernate's change in behavior within Spring Data JPA or if this will have to be addressed in Hibernate. As a next step, I'd recommend opening a Spring Data JPA issue referencing this issue and the Spring Data team can take things from there.