我在卡桑德拉表中存储一个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一起使用时,您需要遵守一些规则(我希望我的有关该主题的博客文章很快就会发表(:
- 您需要使用Java类型-
List
代替Seq
等 - 案例类应具有空构造函数。
,但否则可以将对象映射器与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 + "'")
我的回购中提供了更多示例。