首页 > 解决方案 > 如何使用 QueryBuilder 创建需要更新 UDT 值的更新语句

问题描述

我有以下udt type

CREATE TYPE tag_partitions(
  year bigint,
  month bigint);

和下表

CREATE TABLE ${tableName} (
  tag text,
  partition_info set<FROZEN<tag_partitions>>,
  PRIMARY KEY ((tag))
)

使用以下模型映射表架构

case class TagPartitionsInfo(year:Long, month:Long)
case class TagPartitions(tag:String, partition_info:Set[TagPartitionsInfo])

我编写了一个应该创建Update.IfExists查询的函数:但我不知道应该如何更新该udt值。我尝试使用set,但它不起作用。

def updateValues(tableName:String, model:TagPartitions, id:TagPartitionKeys):Update.IfExists = {
   val partitionInfoType:UserType = session.getCluster().getMetadata
       .getKeyspace("codingjedi").getUserType("tag_partitions")
   //create value
   //the logic below assumes that there is only one element in the set
   val partitionsInfoSet:Set[UDTValue] = model.partition_info.map((partitionInfo:TagPartitionsInfo) =>{
      partitionInfoType.newValue()
        .setLong("year",partitionInfo.year)
        .setLong("month",partitionInfo.month)
   })
   println("partition info converted to UDTValue: "+partitionsInfoSet)

   QueryBuilder.update(tableName).
      `with`(QueryBuilder.WHAT_TO_DO_HERE_TO_UPDATE_UDT("partition_info",partitionsInfoSet))
      .where(QueryBuilder.eq("tag", id.tag)).ifExists()
}

标签: cassandra-3.0datastax-java-driver

解决方案


错误是我partitionsInfoSet在表中添加,但它是一组 Scala。我需要使用转换成 Java 集setAsJavaSet

    QueryBuilder.update(tableName).`with`(QueryBuilder.set("partition_info",setAsJavaSet(partitionsInfoSet)))
      .where(QueryBuilder.eq("tag", id.tag))
      .ifExists()
  }

推荐阅读