【问题标题】:Cassandra: QueryBuilder.update with the list of UDTsCassandra:带有 UDT 列表的 QueryBuilder.update
【发布时间】:2018-06-17 12:37:22
【问题描述】:

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

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 的 DB 实体 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 更新这两列? 提前谢谢!

【问题讨论】:

  • 如果您不向您的问题添加更多信息,这真的很难提供帮助。仍然缺少的是您的 Pojo 实现的样子。您使用了哪些注释?此外,您应该根据我最新的 cmets 更新您的示例。

标签: java cassandra datastax datastax-java-driver cassandra-3.0


【解决方案1】:

您根本无法更新 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。

【讨论】:

  • 这就是我正在做的 - 我正在设置新的数组列表
  • 是的,但你这样做了QueryBuilder.update。我想这应该是QueryBuilder.insert
  • frozen 意味着我不能在列表本身中插入/删除新值,但列表的完全重新插入/重新分配应该可以工作。如您所见,使用 QueryBuilder 会引发映射异常。
  • 如果我没记错的话,更新是相同的插入,但如果主键没有找到记录,它应该会崩溃(但不是 100% 确定。)
  • 请参阅 github.com/datastax/java-driver/blob/3.2.x/driver-mapping/src/…github.com/datastax/java-driver/blob/3.2.x/driver-mapping/src/… 两者都还在。错误消息也清楚地表明您在那里遇到了映射问题。
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多