我将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
答案 0 :(得分:1)
从错误消息中很明显,未创建类型-您需要在创建表之前创建它-在执行代码中的CQL语句时要非常小心-在执行之前,您需要等待模式达成一致下一条语句。这是example of Java code可以做到的-将其转换为Scala很容易。
在Scala中使用Object Mapper时,需要遵守一些规则(我希望有关该主题的博客文章将很快发布):
List
而不是Seq
等,或使用extra codecs for Scala; ,但除此之外,也可以在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中提供了更多示例。