CQL中的SimpleStatement

3

我正在尝试将一个SimpleStatement转换为CQL。

RegularInsert regularStatement = ...;

Map<String, Object> namedValues = new HashMap<>();
namedValues.put("a", "Hello");
namedValues.put("b", 1);

SimpleStatement statement = regularStatement.build(namedValues);

System.out.println(statement.getQuery());
System.out.println(statement.getNamedValues());  // Map<CqlIdentifier, Object>

返回:

INSERT INTO keyspace.table (a,b) VALUES (?,?)
{a=Hello, b=1}

这没问题,但我还需要最终的CQL查询语句:

INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)

我首先尝试将命名值绑定到RegularInsert,这样我就可以使用asCql()获取CQL原始字符串,然后构建一个SimpleStatement。但是它并不像我预期的那样工作:

RegularInsert regularStatement = statementInsertWithKeyspace(database.getDatabaseName());

// Transform <String> to literal <Term>
Map<String, Term> literalNamedValues = namedValues.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, e -> literal(e.getValue())));

regularStatement = regularStatement.values(literalNamedValues);

System.out.println(regularStatement.asCql());

SimpleStatement statement = regularStatement.values(literalNamedValues).build();

System.out.println(statement.getQuery());
System.out.println(statement.getNamedValues());  // Map<CqlIdentifier, Object>

返回:

INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)
INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)
{}

我如何从SimpleStatement中获取原始的CQL,同时保留CQL模板(不带值)?

谢谢。

1个回答

2

仔细研究后发现,一个语句不能同时保存绑定的值和模板。这些值来自于一个ImmutableMap(不可变映射),这意味着一旦你构建了查询或者设置了values(),问号将被实际值不可逆地替换掉。因此,如果你需要同时使用两个对象,一个绑定的,一个未绑定的,则最好的选择似乎是使用两个Statement对象。

RegularInsert regularStatement = ...;

Map<String, Object> namedValues = new HashMap<>();
namedValues.put("a", "Hello");
namedValues.put("b", 1);

// both build() and values() create new Objects
SimpleStatement statement = regularStatement.build(namedValues);
String boundStatement = regularStatement.values(namedValues).asCql();

System.out.println(statement.getQuery());
System.out.println(statement.getNamedValues());  // Map<CqlIdentifier, Object>
System.out.println(boundStatement);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接