我无法使用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))
我尝试将add
和append
用作主键,但收到错误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))
答案 0 :(得分:2)
您在更新语句中使用了不正确的操作-您正在使用append
,但是它用于将数据追加到list
类型的列中。如果要添加单个值(您的情况,因此您甚至不需要将数据明确地包装到add
中),都可以使用Set
;如果要添加,则可以使用addAll
多个值。
QueryBuilder.update(tableName)
.`with`(QueryBuilder.add("partition_info", partitionsInfo))
.where(QueryBuilder.eq("tag", id.tag))