Why is JPA /Hibernate Throwing "java.lang.NegativeArraySizeException: -1" when I try to run a @Query?

Viewed 716

I have the following code...

@Query(
        value = "call schema.pkg.UPDATE(?1)",
        nativeQuery = true
)
void addRecords(String ids);

@Autowired
MyRepository repo;

repo.addRecords(records);

I get...

java.lang.NegativeArraySizeException: -1

    at org.hibernate.loader.custom.ResultRowProcessor.prepareForAutoDiscovery(ResultRowProcessor.java:36)
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:489)
    at org.hibernate.loader.Loader.preprocessResultSet(Loader.java:2357)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2313)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2064)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2026)
    at org.hibernate.loader.Loader.doQuery(Loader.java:951)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:352)
    at org.hibernate.loader.Loader.doList(Loader.java:2857)
    at org.hibernate.loader.Loader.doList(Loader.java:2839)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2671)
    at org.hibernate.loader.Loader.list(Loader.java:2666)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2139)
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1163)
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:173)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1533)
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1581)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:409)
    at com.sun.proxy.$Proxy260.getSingleResult(Unknown Source)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:196)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:142)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:619)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:606)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy217.addRecords(Unknown Source)

I also tried

@Query(
        value = "call schema.pkg.UPDATE(:ids)",
        nativeQuery = true
)
void addRecords(@Param("ids") String ids);

A sample of the string would be 1,2,3,4

Update

The stored proc def...

PROCEDURE UPDATE (    MY_IDS         in varchar2)
2 Answers

You need to use @Procedure annotation:

@Procedure("schema.pkg.UPDATE")
void addRecords(String ids);

EDIT (thanks to @JGleason)

May require named parameters.

@Procedure("schma.pkg.UPDATE") 
void addRecords(@Param("MY_IDS") String ids);

See link

For multiple params, you can use like this

@Procedure("schma.pkg.UPDATE")
void deleteProduct(@Param("MY_IDS") Integer pId, @Param("name") String ticket)
Related