java - 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 模板(无值)?
谢谢你。
解决方案
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);
推荐阅读
- php - 比较两个结果并显示结果 PHP
- telegram-bot - 电报机器人如何向活跃的聊天/用户广播消息
- javascript - 如何添加类型以在节点 v12 中使用 Intl.ListFormat
- windows - 将批处理转换为 VBS 脚本
- msbuild - MSBuild GenerateResource 任务生成命名空间不完整的资源文件名,导致我们的应用在运行时崩溃
- powershell - Powershell同步重命名目录中的文件
- tesseract - 使用 tesseract 对简单图像进行 OCR 识别的准确率低得惊人。我该如何改进它?
- python - 如何使用 OpenCV 和 Python 创建语义图
- python - Python /Pandas 使用 ibm_db 将数据帧插入 DB2 表
- c++ - 在 QWidget 内的 QGraphicsScene 内绘制