Cassandra Java驱动程序:com.datasax.driver.core.exceptions.InvalidTypeException:无效类型,列是列表,但提供了类Java.lang.String
我在Cassandra中有一个用户定义的类型,我在CQLSH中使用以下语法创建了该类型:Cassandra Java驱动程序:com.datasax.driver.core.exceptions.InvalidTypeException:无效类型,列是列表,但提供了类Java.lang.String,java,cassandra,datastax,datastax-java-driver,cassandra-2.1,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\u items”类型的列表,这样我就可以为一个对象存储多个项 大概是这样的: CREATE TABLE order ( order_id
CREATE TYPE order_items (
qty int,
name text,
milk_type text,
size text,
price decimal
);
现在在我的表中,我存储了一个“order\u items”类型的列表,这样我就可以为一个对象存储多个项
大概是这样的:
CREATE TABLE order (
order_id uuid PRIMARY KEY,
amount decimal,
location text,
items list<frozen<order_items>>,
status text,
message text
);
但是,当我尝试使用cassandra的DataStax Java驱动程序执行同样的操作时,我无法提供用户定义的类型作为对象列表。我只能想出一个字符串语法,但显然它抛出了上述错误
我已尝试参考datastax文档,但显然它仍在进行中:
以下是我的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)值,但您已经使用json
或UDTValue
以下是如何通过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);
注意,我已经可以使用CQLSH进行插入,但无法使用JAVA驱动程序进行插入
//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"));