【问题标题】:unable to upsert using java datastax driver无法使用 java datastax 驱动程序进行更新插入
【发布时间】:2018-07-12 16:42:36
【问题描述】:

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

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

【问题讨论】:

    标签: cassandra datastax-java-driver


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试使用 add 但收到错误 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))))
    • 谢谢。为什么我必须删除setAsJavaSet(Set(partitionsInfo))
    • 我以为您要插入一个值。如果那里有多个值,则只需使用 addAll(setAsJavaSet(Set(partitionsInfo))) 代替
    • 抱歉,我没有分享所有信息。架构是CREATE TABLE codingjedi.partitions_of_a_tag ( tag text PRIMARY KEY, partition_info set<frozen<tag_partitions>> )。因为partition_infoUDT 的集合,所以我在做setAsJavaSet(Set(partition_info)),即使我只插入一个值。删除它并使用 add 使其工作。我理解add 的逻辑,但不明白为什么我还要删除setAsJavaSet(Set...))
    • 您需要删除它,因为您添加的只是 UDT 的单个元素,而不是 UDT 集
    猜你喜欢
    • 2013-10-19
    • 2019-04-18
    • 2016-01-22
    • 2021-01-29
    • 2014-05-04
    • 1970-01-01
    • 2015-10-27
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多