java.lang.ClassCastException:java.util.ArrayList 不能使用 cassandra 转换为 java.util.UUID 异常?

Posted

技术标签:

【中文标题】java.lang.ClassCastException:java.util.ArrayList 不能使用 cassandra 转换为 java.util.UUID 异常?【英文标题】:java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.UUID exception with cassandra? 【发布时间】:2020-10-21 06:32:01 【问题描述】:

我有一个与 cassandra 对话的 Spring Boot Java 应用程序。 但是我的一个查询失败了。

 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$$46ffc15e.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 函数来实现查询吗?

这是表定义

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

CREATE TABLE "Openmind".mep_parameterisedlistitem (id uuid PRIMARY KEY, data text, msisdn text, ordernumber int, parameterisedlist uuid) WITH COMPACT STORAGE 这是表定义 CREATE TABLE "Openmind".mep_parameterisedlistitem (id uuid PRIMARY KEY, data text, msisdn text, ordernumber int, parameterisedlist uuid ) WITH COMPACT STORAGE

以上是关于java.lang.ClassCastException:java.util.ArrayList 不能使用 cassandra 转换为 java.util.UUID 异常?的主要内容,如果未能解决你的问题,请参考以下文章