redis-om-spring
redis-om-spring copied to clipboard
findTop or findFirst JPA method fails with JedisDataException: no such index
Hey, I am unsure whether it's an issue or something I did wrong, and I would appreciate any help on this matter.
I have this model:
RedisCursorEntity.java:
package com.bloxbean.cardano.yaci.store.core.storage.impl.model;
import com.bloxbean.cardano.yaci.store.common.model.RedisBaseEntity;
import com.redis.om.spring.annotations.Document;
import com.redis.om.spring.annotations.Indexed;
import com.redis.om.spring.annotations.Searchable;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.Id;
@Data
@SuperBuilder
@NoArgsConstructor
@Document("cursor")
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class RedisCursorEntity extends RedisBaseEntity {
@Id
private String cursorId;
@Indexed
@Searchable
private Long eventPublisherId;
private String blockHash;
@Indexed
private Long slot;
private Long block;
private String prevBlockHash;
private Integer era;
}
RedisBaseEntity.java
package com.bloxbean.cardano.yaci.store.common.model;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.time.LocalDateTime;
@Data
@SuperBuilder
@NoArgsConstructor
public class RedisBaseEntity {
private LocalDateTime createDateTime;
private LocalDateTime updateDateTime;
}
The repository I Use is as follows
@Repository
public interface RedisCursorRepository extends RedisDocumentRepository<RedisCursorEntity, String> {
Optional<RedisCursorEntity> findFirstByEventPublisherIdOrderBySlotDesc(Long id);
}
findFirstByEventPublisherIdOrderBySlotDesc fails with the following exception:
org.springframework.dao.InvalidDataAccessApiUsageException: com.bloxbean.cardano.yaci.store.core.storage.impl.model.RedisCursorEntityIdx: no such index
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:67) ~[spring-data-redis-3.2.2.jar:3.2.2]
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:42) ~[spring-data-redis-3.2.2.jar:3.2.2]
at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:40) ~[spring-data-redis-3.2.2.jar:3.2.2]
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.translateExceptionIfPossible(JedisConnectionFactory.java:921) ~[spring-data-redis-3.2.2.jar:3.2.2]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-6.1.3.jar:6.1.3]
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:335) ~[spring-tx-6.1.3.jar:6.1.3]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) ~[spring-tx-6.1.3.jar:6.1.3]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.3.jar:6.1.3]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.1.3.jar:6.1.3]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.3.jar:6.1.3]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:220) ~[spring-aop-6.1.3.jar:6.1.3]
at jdk.proxy2/jdk.proxy2.$Proxy194.findFirstByEventPublisherIdOrderBySlotDesc(Unknown Source) ~[na:na]
at com.bloxbean.cardano.yaci.store.core.storage.impl.RedisCursorStorage.getCurrentCursor(RedisCursorStorage.java:42) ~[main/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351) ~[spring-aop-6.1.3.jar:6.1.3]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713) ~[spring-aop-6.1.3.jar:6.1.3]
at com.bloxbean.cardano.yaci.store.core.storage.impl.RedisCursorStorage$$SpringCGLIB$$0.getCurrentCursor(<generated>) ~[main/:na]
at com.bloxbean.cardano.yaci.store.core.service.CursorService.getStartCursor(CursorService.java:48) ~[main/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351) ~[spring-aop-6.1.3.jar:6.1.3]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713) ~[spring-aop-6.1.3.jar:6.1.3]
at com.bloxbean.cardano.yaci.store.core.service.CursorService$$SpringCGLIB$$0.getStartCursor(<generated>) ~[main/:na]
at com.bloxbean.cardano.yaci.store.core.service.StartService.start(StartService.java:63) ~[main/:na]
at com.bloxbean.cardano.yaci.store.core.service.AppcationEventListener.initialize(AppcationEventListener.java:23) ~[main/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:365) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:237) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:168) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:149) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:451) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:384) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80) ~[spring-boot-3.2.2.jar:3.2.2]
at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:348) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.2.jar:3.2.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.2.jar:3.2.2]
at com.bloxbean.cardano.yaci.store.app.YaciStoreApplication.main(YaciStoreApplication.java:17) ~[main/:na]
Caused by: redis.clients.jedis.exceptions.JedisDataException: com.bloxbean.cardano.yaci.store.core.storage.impl.model.RedisCursorEntityIdx: no such index
at redis.clients.jedis.Protocol.processError(Protocol.java:105) ~[jedis-5.0.2.jar:na]
at redis.clients.jedis.Protocol.process(Protocol.java:162) ~[jedis-5.0.2.jar:na]
at redis.clients.jedis.Protocol.read(Protocol.java:221) ~[jedis-5.0.2.jar:na]
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:351) ~[jedis-5.0.2.jar:na]
What might be the issue for this?
@edridudi Then the index is not found is typically a sign that the framework can't process the model with the annotations @Indexed
or @Searchable
. Looking above the only issue I see is:
@Indexed
@Searchable
private Long eventPublisherId;
The issue being that currently a field can only have one indexed field in the schema, @Indexed
creates a field of type TAG
while @Seachable
creates one of type TEXT
. So you should remove one of the annotations, for ID type fields typically @Indexed
is what you want, to search by full value of the tag. If you are doing full-text searches on those IDs, using prefixes, suffices, partial string matches etc. then you want @Searchable
. Give that a try and report back what you see. Cheers.
It was my bad... The indexes were not found due to the wrong entity scan package set path. I would recommend though that if 0 indexes are found then try to search them at the found Repository component-level subpackages.