java.lang.ClassCastException:java.util.ArrayList 无法转换为 java.util.UUID 卡桑德拉异常?

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.UUID exception with cassandra?

我有一个 spring 启动 java 应用程序与 cassandra 对话。 但是我的一个查询失败了。

 public class ParameterisedListItemRepository {
    
        private PreparedStatement findByIds;
    
        public ParameterisedListItemRepository(Session session, Validator validator, ParameterisedListMsisdnRepository parameterisedListMsisdnRepository ) {
            this.findByIds =  session.prepare("SELECT * FROM mep_parameterisedListItem WHERE id IN ( :ids )");
    
    
    }
    public List<ParameterisedListItem> findAll(List<UUID> ids){
        
        List<ParameterisedListItem> parameterisedListItemList = new ArrayList<>();

        BoundStatement stmt =this.findByIds.bind();
        stmt.setList("ids", ids);
        session.execute(stmt)
            .all()
            .stream()
            .map(parameterisedListItemMapper)
            .forEach(parameterisedListItemList::add);
        return parameterisedListItemList;
    }
    }

以下是堆栈跟踪

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.UUID
    at com.datastax.driver.core.TypeCodec$AbstractUUIDCodec.serialize(TypeCodec.java:1626)
    at com.datastax.driver.core.AbstractData.setList(AbstractData.java:358)
    at com.datastax.driver.core.AbstractData.setList(AbstractData.java:374)
    at com.datastax.driver.core.BoundStatement.setList(BoundStatement.java:681)
    at com.openmind.primecast.repository.ParameterisedListItemRepository.findAll(ParameterisedListItemRepository.java:128)
    at com.openmind.primecast.repository.ParameterisedListItemRepository$$FastClassBySpringCGLIB$ffc15e.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
    at com.openmind.primecast.repository.ParameterisedListItemRepository$$EnhancerBySpringCGLIB$$b2db3c41.findAll(<generated>)
    at com.openmind.primecast.service.impl.ParameterisedListItemServiceImpl.findByParameterisedList(ParameterisedListItemServiceImpl.java:102)
    at com.openmind.primecast.web.rest.ParameterisedListItemResource.getParameterisedListItemsByParameterisedList(ParameterisedListItemResource.java:94)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

知道出了什么问题。我知道这个查询是问题所在

SELECT * FROM mep_parameterisedListItem WHERE id IN ( :ids )

知道如何更改 findAll 函数来实现查询吗?

这是table定义

CREATE TABLE "Openmind".mep_parameterisedlistitem (
    id uuid PRIMARY KEY,
    data text,
    msisdn text,
    ordernumber int,
    parameterisedlist uuid
) WITH COMPACT STORAGE;

谢谢。

在不知道 table 模式的情况下,我的猜测是对 table 进行了更改,因此模式不再与准备好的语句中的绑定匹配。

问题的很大一部分是您使用 SELECT * 进行的查询。我们的最佳实践建议是 明确地 命名您从 table 检索的所有列。通过在查询中指定列,可以避免 table 架构更改时出现意外情况。

在这种情况下,要么添加了新列,要么删除了旧列。使用缓存的准备好的语句,它期望一种列类型并得到另一种 - ArrayList 不匹配 UUID.

解决方法是重新准备语句并为所有列命名。干杯!