2017-04-04 23 views
0

我在卡桑德拉一个用户定义类型,我用下面的语法创建在CQLSH:卡桑德拉的Java驱动程序:com.datastax.driver.core.exceptions.InvalidTypeException:无效的类型,列清单,但类java.lang.String提供

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驱动程序存储自定义类型列表?

回答

0

你插入查询是不正确的。

如果使用单引号,然后用它的一切,和所有现场昏迷分开。如果该字段为字符串,然后用引号括起来,

使用下面的INSERT查询:

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")); 
+0

指出,我已经可以插入使用CQLSH,但我不能使用Java驱动程序 –

+0

@ApoorvMehta已答复更新 –

+0

插入谢谢你,这个作品 –

相关问题