使用CriteriaUpdate更新一对多关系时触发IndexOutOfBoundsException异常
问题描述
我尝试通过CriteriaUpdate执行部分更新来修改一对多关联关系,但在保存与子实体的关联时遇到了java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0异常。
相关代码
OrganizationRepositoryImpl.update(dto) 实现代码
var criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaUpdate<Organization> update = criteriaBuilder.createCriteriaUpdate(Organization.class); Root<Organization> organization = update.from(Organization.class); // 变量声明与逻辑处理 if (details.isPresent()) { var l = details.get().stream() .map(td -> entityManager.getReference(Detail.class, td)) .toList(); update.set(organization.join("details"), l); } if (identifiers.isPresent()) { var l = identifiers.get().stream() .map(td -> entityManager.getReference(Identifier.class, td)) .toList(); update.set(organization.get("identifiers"), l); } if (addresses.isPresent()) { var l = addresses.get().stream() .map(td -> entityManager.getReference(Address.class, td)) .toList(); update.set(organization.get("addresses"), l); } update.where(criteriaBuilder.equal(organization.get("id"), organizationDTO.getId())); Query query = entityManager.createQuery(update); int rowCount = query.executeUpdate(); log.info("{} rows updated", rowCount);
Organization 实体代码
@Data @Entity public class Organization { @Id @SequenceGenerator(name = "id_sequence", sequenceName = "my_id_sequence", allocationSize = 1) @GeneratedValue(strategy = GenerationType.AUTO, generator = "id_sequence") private Long id; // 字符串类型字段 @JoinColumn(name="organization_id") @OneToMany private List<Detail> details; @JoinColumn(name="organization_id") @OneToMany private List<Identifier> identifiers; @JoinColumn(name="organization_id") @OneToMany private List<Address> addresses; }
Identifier 实体代码
@Data @Entity public class Identifier { @Id @SequenceGenerator(name = "id_sequence", sequenceName = "my_id_sequence", allocationSize = 1) @GeneratedValue(strategy = GenerationType.AUTO, generator = "id_sequence") private Long id; private String text; private String detail; }
报错信息
2023-05-31 20:16:40|ERROR|organizations|http-nio-8080-exec-1|o.a.c.c.C.[.[.[/].[dispatcherServlet] ||Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0] with root cause java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302) at java.base/java.util.Objects.checkIndex(Objects.java:385) at java.base/java.util.ArrayList.get(ArrayList.java:427) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$visitSetClause$4(BaseSqmToSqlAstConverter.java:925) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$consumeSqmParameter$85(BaseSqmToSqlAstConverter.java:4903) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$resolveSqmParameter$90(BaseSqmToSqlAstConverter.java:5321) at org.hibernate.metamodel.mapping.internal.BasicEntityIdentifierMappingImpl.forEachJdbcType(BasicEntityIdentifierMappingImpl.java:191) at org.hibernate.persister.entity.AbstractEntityPersister.forEachJdbcType(AbstractEntityPersister.java:6892) at org.hibernate.metamodel.mapping.EntityValuedModelPart.forEachJdbcType(EntityValuedModelPart.java:88) at org.hibernate.metamodel.mapping.internal.PluralAttributeMappingImpl.forEachJdbcType(PluralAttributeMappingImpl.java:907) at org.hibernate.metamodel.mapping.Bindable.forEachJdbcType(Bindable.java:48) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.resolveSqmParameter(BaseSqmToSqlAstConverter.java:5320) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeSqmParameter(BaseSqmToSqlAstConverter.java:4899) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSetClause(BaseSqmToSqlAstConverter.java:920) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitUpdateStatement(BaseSqmToSqlAstConverter.java:773) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitUpdateStatement(BaseSqmToSqlAstConverter.java:416) at org.hibernate.query.sqm.tree.update.SqmUpdateStatement.accept(SqmUpdateStatement.java:170) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.translate(BaseSqmToSqlAstConverter.java:711) at org.hibernate.query.sqm.internal.SimpleUpdateQueryPlan.createUpdateTranslator(SimpleUpdateQueryPlan.java:119) at org.hibernate.query.sqm.internal.SimpleUpdateQueryPlan.executeUpdate(SimpleUpdateQueryPlan.java:61) at org.hibernate.query.sqm.internal.QuerySqmImpl.doExecuteUpdate(QuerySqmImpl.java:728) at org.hibernate.query.sqm.internal.QuerySqmImpl.executeUpdate(QuerySqmImpl.java:698) at com.company.repository.OrganizationRepositoryImpl.update(OrganizationRepositoryImpl.java:77) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:702) at com.company.repository.OrganizationRepositoryImpl$$SpringCGLIB$$0.update(<generated>) at com.company.service.OrganizationServiceImpl.updateOrganization(OrganizationServiceImpl.java:88) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:390) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:702) at com.company.service.OrganizationServiceImpl$$SpringCGLIB$$0.updateOrganization(<generated>) at com.company.controller.OrganizationsController.patchOrganization(OrganizationsController.java:51) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:888) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:1589)
已尝试的操作
我尝试过使用organization.join(...)和organization.get(...)方法,但问题仍未解决。
内容的提问来源于stack exchange,提问作者Don_Quijote
相关产品推荐
相关产品推荐

