Cassandra:带有UDT列表的QueryBuilder.update

时间:2018-01-08 14:01:20

标签: java cassandra datastax datastax-java-driver cassandra-3.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>>)

我有一个名为shift的数据库实体POJO,它具有这两个属性(忽略其他属性)。

@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 :(得分:0)

您根本无法更新Frozen类型。你只能插入它们。

解决此问题的一种方法是首先获取当前值,将其分配给新的Arraylist,然后使用相同的实体但新列表执行 insert 。 /德尔>

<德尔> 请参阅https://docs.datastax.com/en/cql/3.3/cql/cql_reference/collection_type_r.html

更新1

您应该使用@FrozenValue注释您的Pojo字段,否则映射器不知道该怎么做。

请参阅http://docs.datastax.com/en/developer/java-driver/3.2/manual/object_mapper/creating/#mapping-collections

更新2

您还应该使用@UDT(name="UserAssignment")注释您的POJOS类型。