java - Cassandra-Java-driver : com. datastax.driver.core.exceptions.InvalidTypeException : Invalid type, 列是一个列表,但提供了类 java.lang.String

标签 java cassandra datastax datastax-java-driver cassandra-2.1

我在 Cassandra 中有一个用户定义类型,我在 CQLSH 中使用以下语法创建了该类型:

CREATE TYPE order_items (
    qty int,
    name text,
    milk_type text,
    size text,
    price decimal
);

现在,在我的表中,我存储了一个“order_items”类型的列表,这样我就可以为一个对象存储多个项目。

类似这样的事情:

CREATE TABLE order (
     order_id uuid PRIMARY KEY,
     amount decimal,
     location text,
     items list<frozen<order_items>>,
     status text,
     message text
);

如果我想使用 CQLSH 存储记录,我可以使用以下语法来实现,

INSERT INTO order (order_id,amount,location,items,status,message) VALUES 
(e7ae5cf3-d358-4d99-b900-85902fda9bb0, 5, 'San Jose',[{qty:2,name:'mocha',milk_type:'whole',size:'small',price:2.5}], 'PLACED','order is in process');

但是当我尝试使用 cassandra 的 DataStax Java 驱动程序执行相同操作时,我无法提供用户定义类型作为对象列表。我只能想出一个字符串语法,但显然它抛出了上述错误。

我已尝试引用 datastax 文档,但显然它仍在进行中:http://docs.datastax.com/en/developer/java-driver/3.1/manual/udts/

这是我的 Java 语法:

 session.execute(insertorderPstmt.bind(UUID.randomUUID(),new BigDecimal("4"),"Santa Clara","[{qty:2,name:'mocha',milk_type:'whole',size:'small',price:2.5}]","PLACED","in process"));

和错误:

Exception in thread "main" com.datastax.driver.core.exceptions.InvalidTypeException: Invalid type for value 3, column is a list but class java.lang.String provided

有人能够使用 java 驱动程序存储自定义类型列表吗?

最佳答案

您的插入查询不正确。

如果您使用单引号,则将其用于所有内容,并用逗号分隔所有字段。如果字段是字符串,则用引号将其括起来,

使用下面的插入查询:

INSERT INTO order (
     order_id,
     amount,
     location,
     items,
     status,
     message
 ) VALUES (
    e7ae5cf3-d358-4d99-b900-85902fda9bb0,
    5,
    'San Jose', 
     [
       {qty:2, name:'mocha', milk_type:'whole', size:'small', price:2.5}
     ],
     'PLACED',
     'order is in process'
);

使用 Java 驱动程序:

虽然您要插入用户定义类型 (UDT) 值,但您已创建自定义编解码器或使用 jsonUDTValue 插入值

以下是如何通过 UDTValue 插入值:

//First get your UserType from cluster object
UserType oderItemType = cluster.getMetadata()
        .getKeyspace(session.getLoggedKeyspace())
        .getUserType("order_items");

//Now you can create a UDTValue from your UserType order_items and set value 
UDTValue oderItem = oderItemType.newValue()
        .setInt("qty", 2)
        .setString("name", "mocha")
        .setString("milk_type", "whole")
        .setString("size", "small")
        .setDecimal("price", new BigDecimal(2.5));

// Though you define UDT of List Let's create a list and put the value
List<UDTValue> orders = new ArrayList<>();
orders.add(oderItem);

现在您可以插入如下数据:

//Let your prepared statment be like
PreparedStatement insertorderPstmt = session.prepare("insert into order(order_id,amount,location,items,status,message) values(?, ?, ?, ?, ?, ?)");

//Now you can bind the value and execute query
session.execute(insertorderPstmt.bind(UUID.randomUUID(), new BigDecimal("4"), "Santa Clara", orders, "PLACED", "in process"));

关于java - Cassandra-Java-driver : com. datastax.driver.core.exceptions.InvalidTypeException : Invalid type, 列是一个列表,但提供了类 java.lang.String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43198128/

相关文章:

cassandra - Cassandra 新手,无法理解复制拓扑

java - 在调用 CompletableFuture.completeExceptionally(Throwable) 之前捕获 throwable 与异常

java - apache-cassandra 0.8.2 的问题

connection - Cassandra 集群设置出现 JMX 错误

java - 使用java模拟多个用户连接到Cassandra

cassandra - compaction_throughput_mb_per_sec 的确切含义是什么?

cassandra - Cassandra 中的架构更改超时

java - 通过添加空格使字符串大小相等

java - 如何在使用 proguard 进行混淆期间从 injar 中排除特定的 jar?

java - 使用Java中的声音计将麦克风中的声音录制到文件