无法使用Java datastax驱动程序进行升级

时间:2018-07-12 07:56:37

标签: cassandra datastax-java-driver

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

Cassandra表中的数据存储如下:

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))

1 个答案:

答案 0 :(得分:2)

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

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