Cassandra-Java-driver : com.datastax.driver.core.exceptions.InvalidTypeException: Invalid type, column is a list but class java.lang.String provided
我在 Cassandra 中有一个用户定义类型,我在 CQLSH 中使用以下语法创建了它:
1 2 3 4 5 6 7 | CREATE TYPE order_items ( qty int, name text, milk_type text, size text, price decimal ); |
现在在我的表中,我存储了一个类型为"order_items"的列表,因此我可以为一个对象存储多个项目。
类似这样的:
1 2 3 4 5 6 7 8 | CREATE TABLE order ( order_id uuid PRIMARY KEY, amount decimal, location text, items list<frozen<order_items>>, status text, message text ); |
如果我想使用 CQLSH 存储一条记录,我可以使用以下语法,
1 2 | 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 语法:
1 | 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")); |
和错误:
1 |
有没有人能够使用 java 驱动程序存储自定义类型列表?
您的插入查询不正确。
如果您使用单引号,则将其用于所有内容,并用逗号分隔所有字段。如果字段是字符串,则用引号将其括起来,
使用下面的插入查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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)值,但您已经创建了自定义编解码器或使用
插入值
这是通过 UDTValue 插入值的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //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); |
现在您可以插入如下数据:
1 2 3 4 5 | //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")); |