0
votes

I've update my app from spring boot 1.5.6 to 2.0.6, during a repository method call, spring data jpa rise these exception:

2019-08-06 15:06:09,856 DEBUG org.springframework.web.servlet.DispatcherServlet : Failed to complete request: java.lang.NullPointerException
2019-08-06 15:06:09,929 ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/eLedService].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/eLedService] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
    at org.springframework.data.jpa.repository.query.QueryUtils.applySorting(QueryUtils.java:243)
    at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateQuery(AbstractStringBasedJpaQuery.java:86)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:210)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:129)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:605)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    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:138)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy116.findUnregisteredMeters(Unknown Source)
    at it.eng.eled.data.services.meters.MeterService.findUnregisteredMeters(MeterService.java:89)
    at it.eng.eled.data.services.meters.MeterService$$FastClassBySpringCGLIB$$62d07def.invoke(<generated>)

Method called is:

@Query("SELECT m FROM Meters m JOIN FETCH m.metersInternationalizations mi LEFT JOIN FETCH m.uoM uom LEFT JOIN FETCH uom.uoMInternationalizations uomi WHERE m.plants.id = :plantId AND mi.id.languageId = :languageId AND uomi.id.languageId = :languageId ORDER BY m.id")
    public List<Meters> findUnregisteredMeters(@Param("plantId") Integer plantId, @Param("languageId") Integer languageId, Pageable pageable);

The problem would seem to be related to queries that contain Pageable and order by. Maybe something is changed in new spring data jpa. Have you any idea? Thanks

1
Share example call of that repository method - Nikolai Shevchenko
Hi Nikolay I've added an answer where you can find more details. - Jonathan Scrivano

1 Answers

1
votes

it would seem that in JPA 2.0, when a Pageable is used, it is mandatory to set the sortColumn and avoid order by directly in the query string.

So the query works either with Pageable at null (with order by in query string) or, if you use the Pageable, setting the sortColumn (without order by).

Worked rest call:

{"languageId":1,"plantId":1,"pagination":{"pageNumber":"1","pageSize":"8","offset":"0","sortColumn":"id","sortDirection":"Ascending"}}

{"languageId":1,"plantId":1}