`InvalidQueryException: невозможно проанализировать '[B@50908fa9' как шестнадцатеричные байты` с помощью драйвера Datastax Java

Я пытаюсь вставить массив байтов в тип данных Blob в моей таблице Cassandra. Я использую драйвер Datastax Java. Ниже мой код -

for (Map.Entry<String, byte[]> entry : attributes.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());

    String cql = "insert into test_data (user_id, name, value) values ('"+userId+"', '"+entry.getKey()+"', '"+entry.getValue()+"');";

    System.out.println(cql);

    CassandraDatastaxConnection.getInstance();

    CassandraDatastaxConnection.getSession().execute(cql);

}

И это исключение, которое я получаю обратно -

InvalidQueryException: cannot parse '[B@50908fa9' as hex bytes

Я предполагаю, что проблема в том, как я делаю свой cql выше. Чего-то точно не хватает...

Я создал такую ​​таблицу -

create table test_data (user_id text, name text, value blob, primary key (user_id, name));

Кто-нибудь может мне помочь? Спасибо...


person AKIWEB    schedule 15.10.2013    source источник


Ответы (1)


Проблема в том, что когда вы добавляете массив байтов к String, он вызывает toString для byte[], который печатает бесполезный указатель, который вы видите. Вам нужно вручную преобразовать его в строку для вашего типа данных. В вашем случае вы используете blob, поэтому вам нужно преобразовать его в шестнадцатеричную строку.

В этом вопросе есть код для преобразования byte[] в String:

Как преобразовать массив байтов в шестнадцатеричную строку в Java?< /а>

Вы можете использовать одну из этих функций и добавить к ней '0x'. Затем у вас должна быть действительная строка для вашего блоба.

person Richard    schedule 15.10.2013
comment
Добавляю ли я массив байтов в строку в своем коде? Если да, можете ли вы указать мне, где я это делаю? Есть ли способ напрямую хранить массив байтов в большом двоичном объекте? Как я ожидал, что мы храним массив байтов в типе данных blob в Cassandra? или сохранение массива байтов в виде строки тоже самое? - person AKIWEB; 15.10.2013
comment
Здесь: String cql = "insert into test_data (user_id, name, value) values ('"+userId+"', '"+entry.getKey()+"', '"+entry.getValue()+"');"; entry.getValue() возвращает byte[]. Большой двоичный объект хранит произвольные двоичные данные, но для вставки с помощью CQL он должен быть закодирован как шестнадцатеричная строка. - person Richard; 15.10.2013