为scala嵌套案例类创建cassandra表

时间:2019-06-26 13:44:52

标签: scala cassandra lagom

我将Scala案例类数据存储在Cassandra表中,为此,我需要定义用户定义的类型。我可以编写cql查询,但不知道如何解析它。com.datastax.driver.mapping.annotations.UDT     我已经尝试过该注释,但是对我不起作用。我认为我完全偏离了轨道。     我也尝试过Session课程属于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(AbstractFuture.java:513)               在akka.persistence.cassandra.package $ ListenableFutureConverter $$ anon $ 2. $ anonfun $ run $ 2(package.scala:25)               在scala.util.Try $ .apply(Try.scala:213)               在akka.persistence.cassandra.package $ ListenableFutureConverter $$ 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(Thread.java:748)       引起原因:com.datastax.driver.core.exceptions.InvalidQueryException:未知类型leadpropdb3.optionaldata

1 个答案:

答案 0 :(得分:1)

从错误消息中很明显,未创建类型-您需要在创建表之前创建它-在执行代码中的CQL语句时要非常小心-在执行之前,您需要等待模式达成一致下一条语句。这是example of Java code可以做到的-将其转换为Scala很容易。

在Scala中使用Object Mapper时,需要遵守一些规则(我希望有关该主题的博客文章将很快发布):

  1. 您需要使用Java类型-List而不是Seq等,或使用extra codecs for Scala;
  2. 案例类应具有空的构造函数。

,但除此之外,也可以在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 + "'")

my repo中提供了更多示例。