作为 CQL 的简单语句
SimpleStatement as CQL
我正在尝试将 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>
Returns:
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>
Returns:
INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)
INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)
{}
如何在保留 CQL 模板(无值)的同时从 SimpleStatement
获取原始 CQL?
谢谢。
深入研究,似乎有一个语句不包含绑定值和模板。值来自 ImmutableMap,这意味着,一旦您 build()
查询或设置 values()
,“?”不可撤销地被实际值取代。因此,如果您需要两者 'at once',那么您最好的选择似乎是使用两个语句对象,一个绑定和一个未绑定。
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);
我正在尝试将 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>
Returns:
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>
Returns:
INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)
INSERT INTO keyspace.table (a,b) VALUES ('Hello',1)
{}
如何在保留 CQL 模板(无值)的同时从 SimpleStatement
获取原始 CQL?
谢谢。
深入研究,似乎有一个语句不包含绑定值和模板。值来自 ImmutableMap,这意味着,一旦您 build()
查询或设置 values()
,“?”不可撤销地被实际值取代。因此,如果您需要两者 'at once',那么您最好的选择似乎是使用两个语句对象,一个绑定和一个未绑定。
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);