为Scala嵌套的情况类创建Cassandra表



我在卡桑德拉表中存储一个scala案例类数据,为此,我需要定义用户定义的类型。我可以写CQL查询,但不知道如何解析it.com.datastax.driver.mapping.mapping.annotations.udt 我尝试了此注释,但它不起作用。我认为我完全不在赛道上。 我还尝试了会话课属于com.datastax.driver.core.Session. 我的结论是我不知道该怎么做,我只是在使用HIT和TRAIR。

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.core.exceptions.invalidqueryException:未知类型 e LeadPropDB3.OptionalData java.util.concurrent.executionException:com.datastax.driver.core.core.exceptions.invalidqueryException:Unknown类型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 $ listablefutureconverter $$ anon $ 2 在scala.util.try $ .apply(try.scala:213( 在akka.persistence.cassandra.package $ listablefutureconverter $$ anon $ 2.run(package.scala:25( 在akka.dispatch.taskinvocation.run(AbstractDisPatcher.Scala:40( at Java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1149( at Java.util.concurrent.threadpoolexecutor $ worker.run(threadpoolexecutor.java:624( 在java.lang.thread.run(thread.java:748( 引起的是:com.datastax.driver.core.exceptions.invalidqueryException:未知类型LeadPropdb3.optionalData

从错误消息中很明显没有创建类型 - 您需要在创建表之前创建它 - 从代码执行CQL语句时要非常小心 - 您需要等到在执行下一个语句之前,模式是协议。这是执行此操作的Java代码的示例 - 很容易将其转换为Scala。

当您将对象映射器与Scala一起使用时,您需要遵守一些规则(我希望我的有关该主题的博客文章很快就会发表(:

  1. 您需要使用Java类型-List代替Seq
  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 + "'")

我的回购中提供了更多示例。

相关内容

  • 没有找到相关文章

最新更新