【问题标题】:java.lang.IllegalArgumentException: IN (1): [IsIn, In]is not supported for redis query derivation - Redisjava.lang.IllegalArgumentException: IN (1): [IsIn, In] is not supported for redis query derivation - Redis
【发布时间】:2019-04-15 07:47:50
【问题描述】:

看起来Spring Data Redis 还不支持IsIn, In 查询。我不确定是否有任何其他方法可以作为其非常基本的查询。使用Spring Data RedisRestTemplate 会发生这种情况。

java.lang.IllegalArgumentException: IN (1): [IsIn, In]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.$Proxy76.findByNameIn(Unknown Source)
    at com.mastercard.customer.program.UserGroupTest.test(UserGroupTest.java:58)

Group.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("groups")
public class Group {
    @Id
    private Long groupId;
    private String name;
}

用户.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("users")
public class User {
    @Id
    private Long userId;
    private String name;
}

UserGroupTest.java

@Log4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserGroupTest extends RepositoryTestSupport{
    @Autowired UserRepository userRepository;
    @Autowired GroupRepository groupRepository;

    @Before
    public void setUp() {
        User user1 = User.builder().userId(1L).name("John").build();
        User user2 = User.builder().userId(2L).name("Sally").build();
        User user3 = User.builder().userId(3L).name("Chris").build();

        Group group1 = Group.builder().groupId(1L).name("Nature-Group").build();
        Group group2 = Group.builder().groupId(2L).name("Music-Group").build();
        Group group3 = Group.builder().groupId(3L).name("Sports-Group").build();

        userRepository.save(user1);
        userRepository.save(user2);
        userRepository.save(user3);

        groupRepository.save(group1);
        groupRepository.save(group2);
        groupRepository.save(group3);
    }

    @Test
    public void test() {
        List<User> users = userRepository.findByNameIn(Arrays.asList("John", "Sally"));
        System.out.println(users.size());
    }
}

【问题讨论】:

    标签: spring spring-boot redis jedis spring-data-redis


    【解决方案1】:

    Spring Data Redis 2.1.2(撰写本文时的最新版本)不支持通过查询派生进行In 查询。有一个ticket 支持In 查询类型。

    【讨论】:

    • Example 使用内部或查询(同样适用于In),但它查询单个值而不是数组,因为Example 使用实际域类型作为查询输入类型.
    • Spring Data Redis reference docs 解释什么有效,什么无效。查询区分大小写,因为 Redis 中的所有数据都只是字节。更改字母大小写会导致不同的二进制表示。
    猜你喜欢
    • 2014-07-04
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多