无法使用 java datastax 驱动程序更新

unable to upsert using java datastax driver

我无法使用 datastax 驱动程序 upsert 一行。

Cassandra中的数据table是这样存储的:

tag        | partition_info
------------+--------------------------------------------------
 sometag | {{year: 2018, month: 1}, {year: 2018, month: 2}}

tag 是主键,partition_info 是 UDT

CREATE TYPE codingjedi.tag_partitions (
    year bigint,
    month bigint
);

我希望如果 tag 不存在则创建它。如果 tag 存在,那么新的 udt 值将附加到旧值。我想我不能使用 insert 因为它会覆盖以前的值,即这不起作用

QueryBuilder.insertInto(tableName).value("tag",model.tag)
  .value("partition_info",setAsJavaSet(Set(partitionsInfo)))

我正在尝试使用更新,但它不起作用。 Datastax 驱动程序为以下查询

提供错误 java.lang.IllegalArgumentException
QueryBuilder.update(tableName).`with`(QueryBuilder.append("partition_info",setAsJavaSet(Set(partitionsInfo)))) 
  .where(QueryBuilder.eq("tag", id.tag))

我尝试使用 addappend 作为主键,但出现错误 PRIMARY KEY part tag found in SET part

QueryBuilder.update(tableName).`with`(QueryBuilder.add("tag",id.tag))
      .and(QueryBuilder.append("partition_info",setAsJavaSet(Set(partitionsInfo))))           .where(QueryBuilder.eq("tag", id.tag))

您在更新语句中使用了不正确的操作 - 您使用的是 append,但它用于将数据附加到 list 类型的列。如果您要添加单个值,则可以使用 add (您的情况,因此您甚至不需要明确地将数据包装到 Set 中),或者如果您要添加 addAll多个值。

QueryBuilder.update(tableName)
  .`with`(QueryBuilder.add("partition_info", partitionsInfo))
  .where(QueryBuilder.eq("tag", id.tag))