原因:java.lang.IllegalArgumentException:包含(1):Redis查询派生不支持[IsContaining,Containing,Contains]-Redis [英] Caused by: java.lang.IllegalArgumentException: CONTAINING (1): [IsContaining, Containing, Contains]is not supported for redis query derivation - Redis
问题描述
我正在开发 Spring Boot + Redis
示例.在此示例中,我开发了一些自定义方法,这些方法根据RoleName提取详细信息.对于以下方法 userRepository.findByRole_RoleName("ADMIN")
或 userRepository.findByMiddleNameContaining("Li");
,我们得到了以下异常.
I'm developing Spring Boot + Redis
example. In this example, I've developed some custom methods which pull details based on RoleName. For the below method userRepository.findByRole_RoleName("ADMIN")
or userRepository.findByMiddleNameContaining("Li");
, we're getting the below exception.
参考网址: https://docs.spring.io/spring-data/keyvalue/docs/1.2.15.RELEASE/reference/html/
有人可以请提供程序的指针吗?所有其他方法都可以正常工作.但是只是这种方法引起了问题.我将在下面发布所有必需的代码以供参考.
Could anyone please provider pointers ? All the other methods are working fine. But just this method causing the problems. I will post all the required code below for reference.
错误:
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230)
at com.baeldung.MainAppDemo.main(MainAppDemo.java:21)
Caused by: java.lang.IllegalArgumentException: CONTAINING (1): [IsContaining, Containing, Contains]is not supported for redis query derivation
at org.springframework.data.redis.repository.query.RedisQueryCreator.from(RedisQueryCreator.java:67)
at org.springframework.data.redis.repository.query.RedisQueryCreator.create(RedisQueryCreator.java:53)
at org.springframework.data.redis.repository.query.RedisQueryCreator.create(RedisQueryCreator.java:41)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:119)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81)
at org.springframework.data.keyvalue.repository.query.KeyValuePartTreeQuery.createQuery(KeyValuePartTreeQuery.java:211)
at org.springframework.data.keyvalue.repository.query.KeyValuePartTreeQuery.prepareQuery(KeyValuePartTreeQuery.java:148)
at org.springframework.data.keyvalue.repository.query.KeyValuePartTreeQuery.execute(KeyValuePartTreeQuery.java:106)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:602)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:590)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy65.findByMiddleNameContains(Unknown Source)
at com.baeldung.MainAppDemo.run(MainAppDemo.java:38)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:792)
... 5 common frames omitted
2018-11-04 00:27:29,639 INFO [main] org.springframework.context.support.AbstractApplicationContext: Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f96c77: startup date [Sun Nov 04 00:27:26 IST 2018]; root of context hierarchy
2018-11-04 00:27:29,645 INFO [main] org.springframework.jmx.export.MBeanExporter: Unregistering JMX-exposed beans on shutdown
User.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("user")
public class User {
private @Id String id;
private @Indexed String firstName;
private @Indexed String middleName;
private @Indexed String lastName;
private Role role;
}
Role.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("Role")
public class Role {
private @Id String id;
private @Indexed String roleName;
}
UserRepository.java
public interface UserRepository extends CrudRepository<User, String>{
List<User> findByFirstNameAndLastName(String firstName, String lastName);
List<User> findByMiddleNameContains(String firstName);
List<User> findByRole_RoleName(String roleName);
}
MainAppDemo.java
MainAppDemo.java
@SpringBootApplication
public class MainAppDemo implements CommandLineRunner{
@Autowired
private UserRepository userRepository;
public static void main(String[] args) {
SpringApplication.run(MainAppDemo.class, args);
}
@Override
public void run(String... args) throws Exception {
Role role1 = Role.builder().id("R1").roleName("ADMIN").build();
User user1 = User.builder().firstName("Matt").middleName("Mike").lastName("Wixson").role(role1).build();
Role role2 = Role.builder().id("R2").roleName("API").build();
User user2 = User.builder().firstName("John").middleName("Lima").lastName("Kerr").role(role2).build();
userRepository.save(user1);
userRepository.save(user2);
List<User> u = userRepository.findByFirstNameAndLastName("Matt", "Wixson");
System.out.println("Find By First Name and Last Name = "+u.toString());
List<User> u2 = userRepository.findByMiddleNameContains("Li");
System.out.println("Contains ="+u2);
List<User> adminUser = userRepository.findByRole_RoleName("ADMIN");
System.out.println("ADMIN USER ="+adminUser);
}
}
JIRA缺陷: https://jira.spring.io/browse/DATAREDIS-887
更新:
我开发了这样的查询并从main方法调用,但仍然遇到相同的错误.请提出可行的解决方案.
I developed the query like this and calling from the main method, still I am getting the same error. Please suggest working solution.
@Query("SELECT u FROM User u WHERE u.middleName LIKE :middleName ")
List<User> findByMiddleNameContaining(@Param("middleName") String middleName);
推荐答案
好让我们从"Redis的工作原理"开始
Ok lets start from "How Redis Work"
Redis使用ID的哈希值进行工作,这有助于更快地定位记录.还对@Indexed进行了哈希处理和存储,以更快地精确定位记录
Redis work on Hashes for ID which helps in faster location of record. @Indexed is also hashed and stored for faster pin-pointing the record
因此,默认情况下,对于MiddleName,包含"查询将不起作用,因为测试"字符串的哈希将不包含在字符串"TestUser"的哈希中.
So By Default for MiddleName the "contain" query will not work as Hash for "Test" string will not be contained in Hash for String "TestUser".
但是 ExampleMatcher 在这里是要救援的.
But ExampleMatcher is here to the rescue.
来源: 在角色对象上搜索RoleName的解决方案相对简单:使用此查询
Solution for RoleName search on Role Object is relatively simple: Use this query
userRepository.findByRoleRoleName("ADMIN")(基本上删除下划线)
userRepository.findByRoleRoleName("ADMIN") (Basically remove the underscore)
好消息是它可以与上述 ExampleMatcher 结合使用.
And good news is that it can be combined with the above ExampleMatcher.
如果您有疑问,请继续讨论.
Let's discuss if you have doubt.
有关RoleName搜索的完整帮助参考:查询嵌套对象在Redis中使用Spring Data
Helpfull Reference for RoleName search : Query Nested Objects in Redis using Spring Data
这篇关于原因:java.lang.IllegalArgumentException:包含(1):Redis查询派生不支持[IsContaining,Containing,Contains]-Redis的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!