我正在尝试将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模板(没有值)?
谢谢。
发布于 2021-02-23 10:54:09
深入研究,似乎有一条语句不包含绑定值和模板。值来自ImmutableMap,这意味着,一旦您build()查询或设置values(),"?“不可撤销地被实际值所取代。因此,如果您需要同时使用“同时”,那么您最好的选择是使用两个语句-对象,一个绑定和一个未绑定。
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);https://stackoverflow.com/questions/66247617
复制相似问题