создать таблицу cassandra для класса вложенных дел scala - PullRequest
1 голос
/ 26 июня 2019

Я храню данные класса дел в Scala в таблице Cassandra, для этого мне нужно определить пользовательский тип.Я могу написать запрос cql, но не знаю, как разобрать it.com.datastax.driver.mapping.annotations.UDT Я пробовал эту аннотацию, но она не работает для меня.Я думаю, что я совершенно не в курсе.Я также пробовал принадлежать классу Session к com.datastax.driver.core.Session., и я пришел к выводу, что понятия не имею, как это сделать. Я просто использую hit and trail.

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: Неизвестный тип e leadpropdb3.optionaldata java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.InvalidQuerypropddв 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.запустить (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.option1009 *

1 Ответ

1 голос
/ 26 июня 2019

Из сообщения об ошибке ясно, что тип не был создан - вам нужно создать его перед созданием таблицы - будьте очень осторожны при выполнении операторов CQL из вашего кода - вам нужно подождать, пока схема не станет соглашением, прежде чем выполнять следующее заявление. Вот пример Java-кода , который делает это - его легко конвертировать в Scala.

Когда вы используете Object Mapper со Scala, вам необходимо соблюдать некоторые правила (я надеюсь, что скоро будет опубликован мой пост в блоге на эту тему):

  1. Вам необходимо использовать типы Java - List вместо Seq и т. Д. Или использовать дополнительные кодеки для Scala ;
  2. Классы case должны иметь пустой конструктор.

но в противном случае можно использовать объектный картограф 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 + "'")

Дополнительные примеры доступны в моем репо .

...