我正在使用datastax'Cassandra Java驱动程序 . 我的Cassandra仅支持CQL 2 .
我有一个准备好的INSERT语句,需要接受一个映射列表 .
这是我的架构:
CREATE TYPE test.snap_guid (
l bigint,
h bigint
);
CREATE TABLE test.t (
id bigint,
snap list<frozen<snap_guid>>,
PRIMARY KEY ((id))
)
这是准备好的声明:
PreparedStatement mysttmt = <client>.prepare("INSERT INTO test.t (id, snap) VALUES (?, ?)");
我知道为了将集合绑定到预准备语句,我需要创建一个集合并绑定它 . 我不能把集合括号放在准备好的查询中 . 例如(对于文本列表):
ArrayList<String> snaps = new ArrayList<>();
snaps.add("AEF34GF665");
// INSERT INTO test.t (id, snap) VALUES (?, ?)
BoundStatement bs = mysttmt.bind(12, snaps);
My question is :如何绑定 Map 列表?如何创建下一个查询?
INSERT INTO test.t (id, snap) VALUES (12, [{l:10,h:50}])
// I know it is impossible to create the following prepared statement:
INSERT INTO test.t (id, snap) VALUES (?, [{l:?,h:?}])
// The list of maps has to be a single bound variable... how???
INSERT INTO test.t (id, snap) VALUES (?, ?)
2 回答
创建预准备语句,例如:addUpdateStatement = cassandraClient.getSession() . prepare(“UPDATE my_table_with_set_of_udt SET my_types = my_types?WHERE my_key =?;”); deleteUpdateStatement = cassandraClient.getSession() . prepare(“UPDATE my_table_with_set_of_udt SET my_types = my_types - ?WHERE my_key =?;”);
绑定参数:
要么
使用'my_key'的值将记录插入表中(您可以直接在cql中执行此操作)
运行代码,现在我们可以通过使用UDT更新表来添加/删除元素 .
我有解决方案 .
似乎这个问题是错误的 . 我需要添加一个UDT列表(用户定义的tap),而不是哈希列表 . 为此,您需要使用UserType和UDTValue: