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 *
的查询。我们对最佳做法的建议是明确命名您从表中检索的所有列。通过在查询中指定列,您可以避免在表架构更改时出现意外情况。
在这种情况下,要么添加了新列,要么删除了旧列。使用缓存的准备好的语句,它期待一种列类型并得到另一种 - ArrayList
与 UUID
不匹配。
解决方案是重新准备语句并命名所有列。干杯!
【讨论】:
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 异常?的主要内容,如果未能解决你的问题,请参考以下文章