【问题标题】:How to create an update statement where a UDT value need to be updated using QueryBuilder如何使用 QueryBuilder 创建需要更新 UDT 值的更新语句
【发布时间】:2019-12-10 10:33:08
【问题描述】:

我有以下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.0 datastax-java-driver


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      虽然它没有回答您的确切问题,但使用Object Mapper 会不会更容易?像这样的东西(我没有对它进行大量修改以匹配您的代码):

      @UDT(name = "scala_udt")
      case class UdtCaseClass(id: Integer, @(Field @field)(name = "t") text: String) {
        def this() {
          this(0, "")
        }
      }
      
      @Table(name = "scala_test_udt")
      case class TableObjectCaseClassWithUDT(@(PartitionKey @field) id: Integer,
                                             udts: java.util.Set[UdtCaseClass]) {
        def this() {
          this(0, new java.util.HashSet[UdtCaseClass]())
        }
      }
      

      然后创建案例类并在其上使用mapper.save。 (另请注意,在导入 Scala 编解码器之前,您需要使用 Java 集合)。

      使用 Object Mapper 的主要原因可能是易用性和更好的性能,因为它在后台使用准备好的语句,而不是效率低得多的内置语句。

      您可以在article that I wrote recently 中找到有关 Object Mapper + Scala 的更多信息。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      相关资源
      最近更新 更多