首页 > 解决方案 > SimpleStatement 作为 CQL

问题描述

我正在尝试将 a 转换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第一个,我可以使用它来获取 CQL 原始字符串asCql(),然后构建一个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)
{}

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

谢谢你。

标签: javacassandracqldatastax-java-driver

解决方案


Diving into, it seems that one Statement doesn't hold the bound value AND the template. The Values come from an ImmutableMap which means, once you build() the query or set the values(), the "?" get irrevokably replaced by the actual values. So if you need both 'at once', then your best bet seems to be using two Statement-Objects, one bound and one unbound.

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);

推荐阅读