redis-om-spring
redis-om-spring copied to clipboard
"findBy...Between..()", findBy..GreaterThanEqual() etc. Methods throw NoSuchMethodError
Redis-om-spring version 0.6.0
As an extension to the example of Search on Redis Hashes(in this repo), I added a long field 'startUTC' that is indexed. None of the findBy methods work - findByStartUTCBetween() , findByStartUTCGreaterThanEqual(), findByStartUTCGreaterThanEqualAndStartUTCLessThanEqual() work. On using FT.SEARCH on the same index with the due params gives correct result for all of them. The stack trace on searching using OM is as follows:
java.lang.NoSuchMethodError: 'org.springframework.data.mapping.InstanceCreatorMetadata org.springframework.data.redis.core.mapping.RedisPersistentEntity.getInstanceCreatorMetadata()' at com.redis.om.spring.convert.MappingRedisOMConverter.lambda$doReadInternal$0(MappingRedisOMConverter.java:198) ~[redis-om-spring-0.6.0.jar:na] at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:360) ~[spring-data-commons-2.6.3.jar:2.6.3] at com.redis.om.spring.convert.MappingRedisOMConverter.doReadInternal(MappingRedisOMConverter.java:196) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.convert.MappingRedisOMConverter.read(MappingRedisOMConverter.java:142) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.util.ObjectUtils.documentToObject(ObjectUtils.java:236) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.lambda$executeQuery$5(RedisEnhancedQuery.java:353) ~[redis-om-spring-0.6.0.jar:na] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.executeQuery(RedisEnhancedQuery.java:354) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.execute(RedisEnhancedQuery.java:269) ~[redis-om-spring-0.6.0.jar:na] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.18.jar:5.3.18] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.18.jar:5.3.18] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.18.jar:5.3.18] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.18.jar:5.3.18] at jdk.proxy3/jdk.proxy3.$Proxy85.findByStartUTCGreaterThanEqualAndStartUTCLessThanEqual(Unknown Source) ~[na:na]
@AnujaK can you provide a code sample, I just tried it with a long field on a @RedisHash
mapping and a between query like:
Model:
package com.redis.om.spring.annotations.hash.fixtures;
import java.util.HashSet;
import java.util.Set;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import com.redis.om.spring.annotations.AutoComplete;
import com.redis.om.spring.annotations.Bloom;
import com.redis.om.spring.annotations.Indexed;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Data
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@RedisHash("people")
public class Person {
@Id
String id;
@NonNull
String name;
@NonNull
@Indexed
Long numberOfPets; // The long being indexed
@NonNull
@AutoComplete
@Bloom(name = "bf_person_email", capacity = 100000, errorRate = 0.001)
String email;
@NonNull
@Bloom(capacity = 100000, errorRate = 0.001)
String nickname;
@NonNull
@Indexed
Set<String> roles = new HashSet<String>();
@NonNull
Set<String> favoriteFoods = new HashSet<String>();
}
Repository:
@Repository
public interface PersonRepository extends RedisEnhancedRepository<Person, String>, EmailTaken {
// find by numeric property range
Iterable<Person> findByNumberOfPetsBetween(long nopGT, long nopLT);
}
That works just fine.
Thanks Brian.My classes look pretty similar. Not able to figure out what's different or wrong!
@Data
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor
@RedisHash
public class Call {
@Id
private String id;
@Indexed @NonNull
private long insertUTC;
@NonNull
private String sessionId;
@Indexed @NonNull
private long startUTC;
@Searchable @NonNull
private long queryNo;
@Indexed @NonNull
private String controlPolicy;
@NonNull
private String callStatus;
@NonNull
private long purgeUTC;
// audit fields
@CreatedDate
private Date createdDate;
}
Repo:
@Repository
public interface CallRepository extends CrudRepository<Call, String> {
List<Call> findByControlPolicy(String policy);
Iterable<Call> search(String policy);
// Tried returning Iterable instead of List as well; Same error for the methods below
List<Call> findByQueryNoContainingIgnoreCase(String mobile);
List<Call> findByStartUTCGreaterThanEqualAndStartUTCLessThanEqual(long startTime, long endTime);
List<Call> findByStartUTCBetween(long startTime, long endTime);
List<Call> findByStartUTCGreaterThanEqual( long startTime);
}
@AnujaK it could be the startUTC
with all caps for UTC is causing an issue, can you try startUtc
and report back?
I changed startUTC to startUtc and recreated the DB. I continue to get:
java.lang.NoSuchMethodError: 'org.springframework.data.mapping.InstanceCreatorMetadata org.springframework.data.redis.core.mapping.RedisPersistentEntity.getInstanceCreatorMetadata()'
at com.redis.om.spring.convert.MappingRedisOMConverter.lambda$doReadInternal$0(MappingRedisOMConverter.java:198) ~[redis-om-spring-0.6.0.jar:na]
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:360) ~[spring-data-commons-2.6.3.jar:2.6.3]
at com.redis.om.spring.convert.MappingRedisOMConverter.doReadInternal(MappingRedisOMConverter.java:196) ~[redis-om-spring-0.6.0.jar:na]
at com.redis.om.spring.convert.MappingRedisOMConverter.read(MappingRedisOMConverter.java:142) ~[redis-om-spring-0.6.0.jar:na]
at com.redis.om.spring.util.ObjectUtils.documentToObject(ObjectUtils.java:236) ~[redis-om-spring-0.6.0.jar:na]
at com.redis.om.spring.repository.query.RedisEnhancedQuery.lambda$executeQuery$5(RedisEnhancedQuery.java:353) ~[redis-om-spring-0.6.0.jar:na]
...
The command line query works fine:
FT.SEARCH com.redis.om.hashes.domain.CallIdx "@startUtc:[1665035502 1665035503]"
Can you post the repository code and the full model and I’ll debug it on my end, a ZIp or a link to a repo will do the trick.
On Thu, Oct 6, 2022 at 6:37 AM Anuja Kumar @.***> wrote:
I changed startUTC to startUtc and recreated the DB. I continue to get:
java.lang.NoSuchMethodError: 'org.springframework.data.mapping.InstanceCreatorMetadata org.springframework.data.redis.core.mapping.RedisPersistentEntity.getInstanceCreatorMetadata()' at com.redis.om.spring.convert.MappingRedisOMConverter.lambda$doReadInternal$0(MappingRedisOMConverter.java:198) ~[redis-om-spring-0.6.0.jar:na] at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:360) ~[spring-data-commons-2.6.3.jar:2.6.3] at com.redis.om.spring.convert.MappingRedisOMConverter.doReadInternal(MappingRedisOMConverter.java:196) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.convert.MappingRedisOMConverter.read(MappingRedisOMConverter.java:142) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.util.ObjectUtils.documentToObject(ObjectUtils.java:236) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.lambda$executeQuery$5(RedisEnhancedQuery.java:353) ~[redis-om-spring-0.6.0.jar:na] ...
The command line query works fine: FT.SEARCH com.redis.om.hashes.domain.CallIdx @.***:[1665035502 1665035503]"
— Reply to this email directly, view it on GitHub https://github.com/redis/redis-om-spring/issues/112#issuecomment-1269300290, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAF4LIO7T6SDYSZUFQEAVTWBZJQRANCNFSM6AAAAAAQZTXAJM . You are receiving this because you were assigned.Message ID: @.***>
-- Cheers, Brian https://integrallis.com
Redis-OM.zip Java version: Openjdk 17.0.2
@AnujaK The problem was mismatched version of Spring in the POM. I updated those and pushed a working copy to https://github.com/bsbodden/issue-112
Hey thanks @bsbodden , the fix works great!