Cassandra Query не возвращает никаких данных

Я использую репозиторий Cassandra для извлечения данных из базы данных. Я использую следующий запрос (чтобы быть максимально простым):

public interface PersonReposiroty extends CassandraRepository<Person>
    @Query("SELECT * FROM KeySp.person WHERE joinTime >= 21 ALLOW FILTERING")
    public List<Person> findByTime();
}

Когда это вызывается оператором Java:

List<Person> persons = repository.findByTime();

Он производит NullPointerException.

Фактически, любой запрос, который должен возвращать какие-либо данные из БД, показывает исключение.

В то же время функции Update, Delete, Save прекрасно работают при реализации с использованием указанного выше репозитория.

Скажите, пожалуйста, в чем я ошибаюсь и как это сделать. (Использую Spring Boot)

Заранее спасибо.

Моя личная сущность:

@Entity
@Table(name = "person", indexes = { @Index(name = "peson_index", columnList = "joinTime, category, personId") })
public class Person {

    @Id
    @PrimaryKeyColumn
    private PersonContext context;

    @Column(name = "address", columnDefinition = "LONGTEXT")
    private String address;

    public PersonContext getContext() {
        return context;
    }

    public void setContext(PersonContext context) {
        this.context = context;
    }

    public String getAddress() {
        return adress;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

И PersonContext.java - это

@Embeddable
@PrimaryKeyClass
public class PersonContext implements Serializable {

    private static final long serialVersionUID = 3L;

    @NotNull
    @PrimaryKeyColumn(name = "joinTime", type = PrimaryKeyType.PARTITIONED)
    private long joinTime;

    @NotNull
    @Column(name = "category")
    private String category;

    @Column(name = "person_id", length = 50)
    private String personId = StringUtils.EMPTY;

    public long getjoinTime() {
        return joinTime;
    }

    public void setjoinTime(long joinTime) {
        this.joinTime = joinTime;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getPersonId() {
        return personId;
    }

    public void setPersonId(String personId) {
        this.personId = personId;
    }

}

Трассировки стека:

    ForgivingExceptionHandler: Consumer com.User.service.CacheService$1@6e6c7b7a (amq.ctag-6VuMjQcL3vjdfed2yC78zA) method handleDelivery for channel AMQChannel(amqp://[email protected]:5672/,1) threw an exception for channel AMQChannel(amqp://[email protected]:5672/,1)
java.lang.NullPointerException: null
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readProperty(MappingCassandraConverter.java:259)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter$1.doWithPersistentProperty(MappingCassandraConverter.java:233)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter$1.doWithPersistentProperty(MappingCassandraConverter.java:229)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:330)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readProperties(MappingCassandraConverter.java:229)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readPropertiesFromRow(MappingCassandraConverter.java:223)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readEntityFromRow(MappingCassandraConverter.java:190)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readRow(MappingCassandraConverter.java:176)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.read(MappingCassandraConverter.java:298)
    at org.springframework.data.cassandra.core.CassandraConverterRowCallback.doWith(CassandraConverterRowCallback.java:47)
    at org.springframework.data.cassandra.core.CassandraTemplate.processResultSet(CassandraTemplate.java:605)
    at org.springframework.data.cassandra.core.CassandraTemplate.select(CassandraTemplate.java:594)
    at org.springframework.data.cassandra.core.CassandraTemplate.select(CassandraTemplate.java:376)
    at org.springframework.data.cassandra.repository.query.CassandraQueryExecution$CollectionExecution.execute(CassandraQueryExecution.java:85)
    at org.springframework.data.cassandra.repository.query.CassandraQueryExecution$ResultProcessingExecution.execute(CassandraQueryExecution.java:143)
    at org.springframework.data.cassandra.repository.query.AbstractCassandraQuery.execute(AbstractCassandraQuery.java:113)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy142.findByResource(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy142.findByTime()
    at User.StatisticsCacheService.storeDataInternal(StatisticsCacheService.java:46)
    at User.CacheService$1.handleDelivery(CacheService.java:54)
    at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
    at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
2018-10-31 13:02:48,193 ERROR [User-scheduler-2] TaskUtils$LoggingErrorHandler: Unexpected error occurred in scheduled task.
com.rabbitmq.client.AlreadyClosedException: channel is already closed due to clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=Closed due to exception from Consumer (amq.ctag-6VuMjQcL3vjdfed2yC78zA) method handleDelivery for channel AMQChannel(amqp://[email protected]:5672/,1), class-id=0, method-id=0)
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:253)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:336)
    at com.rabbitmq.client.impl.ChannelN.basicConsume(ChannelN.java:1365)
    at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicConsume(AutorecoveringChannel.java:540)
    at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicConsume(AutorecoveringChannel.java:494)
    at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicConsume(AutorecoveringChannel.java:472)
    at User.service.CacheService.cacheDataInternal(CacheService.java:59)
    at User.service.periodic.StatisticsCacheService.cacheData(StatisticsCacheService.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Пожалуйста, добавьте stacktrace (ошибка, которую вы получили в журналах) .. чтобы выяснить, почему это происходит ?? также добавьте свой Entity Class Person

Vikrant Kashyap 31.10.2018 07:58

Теперь он может идентифицироваться только по трассировке стека ошибок ... но все еще не может отслеживать, но я думаю, что проблема с вашим запросом, который вы написали в аннотации @Query (точно).

Vikrant Kashyap 31.10.2018 08:23

Любой запрос с аннотацией @Query, который не возвращает никакого значения, такого как удаление, сохранение или обновление, отлично работает, когда я использую тот же метод. Более того, если я использую тот же запрос SELECT * FROM person.details WHERE joinTime >= 21 ALLOW FILTERING; на сервере Cassandra, я получаю resultSet. Проблема возникает, когда я пытаюсь выполнить выборку с Java.

The Dude 31.10.2018 08:26

Я также добавил трассировку стека в запрос выше. Но я считаю, что там написано Соединение закрыто. Вероятно, это связано с тем, что NPE вызвал закрытие соединения и больше не может подключиться к серверу.

The Dude 31.10.2018 08:29

Если вы внимательно посмотрите на трассировку стека исключений, она покажет com.rabbitmq.client.AlreadyClosedException:, который полностью не связан с кассандрой .. Пожалуйста, добавьте полную трассировку стека, а не часть .. вышеупомянутого исключения, вызванного api обмена сообщениями rabbitmq, а не кассандрой ... поэтому, пожалуйста, добавьте полную трассировку стека. Спасибо :)

Vikrant Kashyap 31.10.2018 08:34

Раньше я не использовал Cassandra, но использовал данные spring jpa и elasticsearch. Я вижу несколько опечаток: @Index(name = "peson_index", public interface PersonReposiroty. Затем в своем @Query вы запрашиваете person.details, но я не могу найти никаких «подробностей» в предоставленном вами коде. Может, это NPE?

evandongen 31.10.2018 08:37

@VikrantKashyap Я добавил полную stackTrace. и я считаю, что AlreadyClosedException вызван тем, что NPE вызвал закрытие всех созданных мной соединений. По сути, я отслеживаю данные с сервера RabbitMQ и сохраняю их в БД, а затем извлекаю эти данные из БД и показываю их клиенту. Это может показаться сложным, но я хочу, чтобы программа работала именно так. NPE приводит к закрытию соединения между сервером RabbitMQ и java, следовательно, это исключение.

The Dude 31.10.2018 08:45

@evandongen В cassandra мы должны указать пространство ключей и имя таблицы для выполнения операций с таблицей .. В моем запросе Keysp - это пространство ключей, а person - имя таблицы, следовательно, Keysp.person.

The Dude 31.10.2018 08:46

@ user8622966 Я вижу, вы изменили запрос. Это кажется логичным;)

evandongen 01.11.2018 11:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
437
0

Другие вопросы по теме