You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:47:05