首页 文章

Cassandra:QueryBuilder.update包含UDT列表

提问于
浏览
0

我们有一个表,其中两列是:

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_assignmentsuser_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 回答

  • 0

    您根本无法更新冻结类型 . 你只能插入它们 .

    解决此问题的一种方法是首先获取当前值,将其分配给新的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类型 .

相关问题