我已经将我应用程序从spring boot 1.5.6更新到2.0.6,在仓库方法调用期间,spring data jpa会引发以下异常:
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>)调用的方法是:
@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);问题似乎与包含可分页和排序依据的查询有关。也许在新的spring data jpa中有一些改变。你知道吗?谢谢
发布于 2019-08-07 15:52:35
似乎在JPA2.0中,当使用可分页时,必须设置sortColumn并避免直接在查询字符串中使用order by。
因此,查询要么在空值时可分页(在查询字符串中使用order by),要么在使用可分页时设置sortColumn (不带order by )。
工作的rest调用:
{"languageId":1,"plantId":1,"pagination":{"pageNumber":"1","pageSize":"8","offset":"0","sortColumn":"id","sortDirection":"Ascending"}}
{"languageId":1,"plantId":1}https://stackoverflow.com/questions/57378605
复制相似问题