我们有一个表,其中两列是:
user_assignments frozen<list<shift_user_assignment>>,
user_offers frozen<list<shift_user_assignment>>,
和 shift_user_assignment
是
CREATE TYPE IF NOT EXISTS shift_user_assignment (
id timeuuid,
note varchar,
breaks frozen<list<shift_break>>)
我有DB实体POJO,名为 shift
,具有这两个属性(忽略其他属性) .
@Column("user_assignments")
private List<UserAssignment> userAssignments;
@Column("user_offers")
private List<UserAssignment> userOffers;
我尝试使用QueryBuilder更新 user_assignments
和 user_offers
.
Update update = QueryBuilder.update(ShiftById.TABLE_NAME);
update.with(QueryBuilder.set("user_assignments", shift.getUserAssignments()))
.and(QueryBuilder.set("user_offers", shift.getUserOffers()))
.where(QueryBuilder.eq("company_id", companyId))
.and(QueryBuilder.eq("id", shift.getId()));
cassandraTemplate.execute(update)
但我收到了
org.springframework.cassandra.support.exception.CassandraTypeMismatchException: Value 0 of type class java.util.ArrayList does not correspond to any CQL3 type; nested exception is com.datastax.driver.core.exceptions.InvalidTypeException: Value 0 of type class java.util.ArrayList does not correspond to any CQL3 type
at org.springframework.cassandra.support.CassandraExceptionTranslator.translateExceptionIfPossible(CassandraExceptionTranslator.java:84) ~[spring-cql-1.5.3.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.potentiallyConvertRuntimeException(CqlTemplate.java:946) ~[spring-cql-1.5.3.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.translateExceptionIfPossible(CqlTemplate.java:930) ~[spring-cql-1.5.3.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.translateExceptionIfPossible(CqlTemplate.java:912) ~[spring-cql-1.5.3.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:278) ~[spring-cql-1.5.3.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:559) ~[spring-cql-1.5.3.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.execute(CqlTemplate.java:1333) ~[spring-cql-1.5.3.RELEASE.jar:na]
如果我使用Spring Data Cassandra存储实体,则没有问题 . 任何线索我应该映射什么/在哪里/如何映射,以便能够使用QueryBuilder更新这两列?先感谢您!
1 回答
您根本无法更新冻结类型 . 你只能插入它们 .
解决此问题的一种方法是首先获取当前值,将其分配给新的Arraylist,然后使用相同的实体插入新列表 .
请参阅https://docs.datastax.com/en/cql/3.3/cql/cql_reference/collection_type_r.html
Update 1
您应该使用
@FrozenValue
注释您的Pojo字段,否则映射器不知道该怎么做 .见http://docs.datastax.com/en/developer/java-driver/3.2/manual/object_mapper/creating/#mapping-collections
Update 2
您还应该使用
@UDT(name="UserAssignment")
注释您的POJOS类型 .