为scala嵌套case类创建cassandra表

stszievb  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(419)

我正在cassandra表中存储scala case类数据,为此,我需要定义用户定义的类型。我可以写cql查询,但不知道如何解析它。com.datastax.driver.mapping.annotations.udt我尝试过这个注解,但它对我无效。我想我完全偏离了轨道。我也试过属于我的课程 com.datastax.driver.core.Session. 我的结论是我不知道该怎么做,我只是在用追踪法。

case class Properties(name: String,
label: String,
                           description: String,
                           groupName: String,
                           fieldDataType: String,
                           options: Seq[OptionalData]
                         )
object Properties{
  implicit val format: Format[Properties] = Json.format[Properties]
}

case class OptionalData(label: String, name: String)
object OptionalData{
  implicit val format: Format[OptionalData] = Json.format[OptionalData]
}

我的问题是:

val optionalData: String=
    """
      |CREATE TYPE IF NOT EXISTS optionaldata(
      |label text,
      |name text
      );
    """.stripMargin

   val createPropertiesTable: String =       """
                          |CREATE TABLE IF NOT EXISTS prop(
                          |name text Primary Key,
                          |label text,
                          |description text,
                          |groupname text,
                          |fielddatatype text,
                          |options LIST<frozen<optionaldata>>
                          );
                        """.stripMargin

com.datastax.driver.core.exceptions.invalidqueryexception:未知类型leadpropdb3.optionaldata java.util.concurrent.executionexception:com.datastax.driver.core.exceptions.invalidqueryexception:未知类型leadpropdb3.optionaldata位于com.google.common.util.concurrent.abstractfuture.getdonevalue(abstractfuture)。java:552)在com.google.common.util.concurrent.abstractfuture.get(抽象未来。java:513)在akka.persistence.cassandra.package$listenablefuturecoverter$$anon$2.$anonfun$run$2(包)。scala:25)在scala.util.try$.apply(try。scala:213)在akka.persistence.cassandra.package$listenablefuturecoverter$$anon$2.run(package。scala:25)在akka.dispatch.taskinvocation.run(abstractdispatcher。scala:40)位于java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor。java:1149)在java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor。java:624)在java.lang.thread.run(线程。java:748)原因:com.datastax.driver.core.exceptions.invalidqueryexception:未知键入leadpropdb3.optionaldata

w9apscun

w9apscun1#

从错误消息中可以清楚地看出,类型没有被创建—您需要在创建表之前创建它—在从代码中执行cql语句时要非常小心—您需要等到模式达成协议后,再执行下一个语句。下面是一个java代码的例子,可以很容易地将其转换为scala。
当您在scala中使用对象Map器时,您需要遵守一些规则(我希望我关于这个主题的博客文章很快就会发表):
你需要使用java类型- List 而不是 Seq 等,或者为scala使用额外的编解码器;
case类应该有空构造函数。
但在其他情况下,可以将对象Map器与scala一起使用,如下所示:

@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,
                                       udt: UdtCaseClass) {
  def this() {
    this(0, UdtCaseClass(0, ""))
  }
}

// ...
val mapperForUdtCaseClass = manager.mapper(classOf[TableObjectCaseClassWithUDT])
val objectCaseClassWithUDT = mapperForUdtCaseClass.get(new Integer(1))
println("ObjWithUdt(1)='" + objectCaseClassWithUDT + "'")

更多的例子可以在我的回购。

相关问题