как конвертировать Scala Список байтов в blob - PullRequest
0 голосов
/ 25 июня 2018

Моя схема использует blob тип

    id uuid PRIMARY KEY,
    a  text,
    d  text,
    h  list<text>,
    i list<blob>,
    p  text,
    t  set<text>,
    title text

Я отправляю клиента json fromm, который преобразуется в класс case, а затем я использую класс case в QueryBuilder. В json я отправляю string для свойства, которое будет сохранено как blob, и я хочу преобразовать string в blob при вставке в Cassandra. Но я не знаю, как это сделать.

json является PracticeQuestion(Some(2b01be60-6210-4449-ad40-6b97297d69f2),d,List(d),List(List(1)),d,Set(d),d,d)

case class является

case class Data (id: Option[UUID],
                              d : String, //text in cassandra
                              h : List[String], //list <text>
                              i : List[Seq[Byte]], //list<blob>. 
                              p : String,//string
                              t : Set[String], //set<text>
                              title : String, // text
                              a:String ) //text

QueryBuilder код

def  insertValues(tableName:String, model:PracticeQuestion):Insert = {
    QueryBuilder.insertInto(tableName).value("id",model.id.get)
      .value("a",model.a)
      .value("d",model.d)
      .value("h",seqAsJavaList(model.h)) 
      .value("image",seqAsJavaList(model.image)) //this probably isn't correct.
      .value("p",model.p)
      .value("t",setAsJavaSet(model.t))
      .value("title",model.title)
      .ifNotExists();       }

Когда я запускаю свой код, я получаю следующую ошибку Errorcom.datastax.driver.core.exceptions.InvalidTypeException: Value 4 of type class scala.collection.convert.Wrappers$SeqWrapper does not correspond to any CQL3 type

1 Ответ

0 голосов
/ 26 июня 2018

Первое, что вы можете сделать, это изменить схему стола.Потому что Cassandra не поддерживает тип данных Seq [List [Bytes]].

Если это невозможно, вы можете попробовать следующее.

Проблема в том, что Cassandra не поддерживает List[Byte], поэтому у него есть блоб типа данных, который фактически принимает шестнадцатеричное значение.Поскольку у вас есть массив байтов, и вам нужно установить его в качестве значения для вашего 4-го поля, я бы предложил вам использовать BoundStatements с методом setList(yourList), чтобы вы могли установить значение для вашего readyStatement.

Вы можете сделать что-то вроде этого.

BoundStatement bound = ps1.bind()

bound.setList(yourList[Byte])

session.execute(bound)

Вы можете сослаться на это:

https://docs.datastax.com/en/developer/java-driver/3.0/manual/statements/prepared/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...