findFirstBy и findTopBy не работают с Spring Data Elasticsearch

Я пытаюсь получить последнюю запись в коллекции, используя findFirstBy и findTopBy, но она не работает с Spring Data Elasticsearch и генерирует исключение NullPointerException.

Мой метод репозитория выглядит следующим образом:

@Repository
public interface MyRepository extends ElasticsearchRepository<PointInTime, String> {
     PointInTime findFirstByDbInstanceIdOrderByCreationTimeDesc(String dbInstanceId);
}

Исключение -

java.lang.NullPointerException
        at org.springframework.data.elasticsearch.core.ElasticsearchTemplate.queryForPage(ElasticsearchTemplate.java:289)
        at org.springframework.data.elasticsearch.core.ElasticsearchTemplate.queryForObject(ElasticsearchTemplate.java:233)
        at org.springframework.data.elasticsearch.repository.query.ElasticsearchPartQuery.execute(ElasticsearchPartQuery.java:59)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:421)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:381)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:512)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at com.sun.proxy.$Proxy66.findFirstByOrderByCreationTimeDesc(Unknown Source)
        at com.comp.prod.assetmanagement.service.PointInTimeService.getLatestPointInTime(PointInTimeService.java:103)
        at com.comp.prod.assetmanagement.controller.PointInTimeController.getPointInTimes(PointInTimeController.java:135)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.comp.prod.common.filter.CloudCORSFilter.doFilter(CloudCORSFilter.java:79)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:186)
        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.logging.log4j.core.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:66)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source) 

person JavaPlayer    schedule 02.01.2015    source источник
comment
Не похоже, что это будет поддерживаться до версии 4.0 Spring Data Elasticsearch: github.com/spring-projects/spring-data-elasticsearch/pull/305   -  person Mark B    schedule 01.03.2020


Ответы (3)


Это старая тема, но у меня сейчас такая же проблема.

Похоже, ключевые слова First и Top не реализованы, по крайней мере, в текущей версии Elasticsearch Spring Data (1.2.2.RELEASE).

Лучшей альтернативой является использование Pageable и передача new PageItem(0, 1) в качестве параметра.

person Florian Courtial    schedule 14.08.2015

Вы также можете попробовать это решение,

PointInTime pointInTime = null;

if (myRepository.findAllByDbInstanceIdOrderByCreationTimeDesc(dbInstanceId) != null 
    && !myRepository.findAllByDbInstanceIdOrderByCreationTimeDesc(dbInstanceId).isEmpty()) {
   
pointInTime = myRepository.findAllByDbInstanceIdOrderByCreationTimeDesc(dbInstanceId).get(0);

}

Предположим, что myRepository является автоматически подключаемым объектом вашего интерфейса MyRepository.

person Henil Mamaniya    schedule 05.12.2020
comment
Ваш ответ не хорош. findAll() никогда не вернет null, он вернет пустой список, если элементы не найдены. Нет необходимости вызывать метод дважды. Вызовите if за один раз и сохраните возвращенные данные, а затем проверьте условие. Правильный способ использовать pageable и избегать повторного вызова одного и того же метода. Также старайтесь избегать использования findAll без разбивки на страницы, это приведет к плохой производительности для больших наборов данных. - person Mohd Alomar; 06.12.2020
comment
Спасибо @MohdAlomar за улучшение моего ответа. Берегись. - person Henil Mamaniya; 06.12.2020

В данных Spring мы можем получить верхнюю запись, давайте попробуем этот метод

findTop1ByOrderByClientRoleIdAsc() 

ClientRoleId – это имя столбца.

person chandrashekar.n    schedule 21.12.2017