java - StringJoiner - 括号中的每一项
问题描述
为了在 Java 应用程序中安装 SQL 模板,我需要按如下方式格式化元素:
RIGHT JOIN (values (123), (456), (789)..
特别是,给定一个 Java 整数列表:
List<int> ints = Arrays.asList(123, 456, 789)
如何正确使用StringJoiner(示例)输出以下字符串?
(123), (456), (789)
我能找到的最接近的例子是
StringJoiner mystring = new StringJoiner(",", "(", ")");
哪个返回
(123, 456, 789)
更多背景/上下文
MadProgrammer 指出,我可以通过不同的方式处理这个问题PreparedStatement
。这是我要填写的实际查询...
例如,这是本机 SQL中的查询片段:
SELECT loadlist.id as load_id, payload
FROM payload_log
RIGHT JOIN (values (123), (456), (789)) as loadlist(id)
ON payload_log.entity_id = loadlist.id;
这是从应用程序调用它的方式。理想情况下,我们可以使用:ids
参数进行绑定,但不确定如何使用 joiner 进行 String.format 绑定。
String queryString = String.format("SELECT loadlist.id as load_id, payload\n"+
"FROM payload_log" +
" RIGHT JOIN (values (:ids)) as loadlist(id)" +
" ON payload_log.entity_id = loadlist.id)";
return entityManager.createNativeQuery(queryString).setParameter("ids", loadIds);
现在我应该能够在应用格式后传递:ids
参数,如下面的答案?query.setParameter
那么PreparedStatement
适合在哪里呢?
解决方案
使用现有代码,最简单的方法是将括号添加到分隔符:
StringJoiner mystring = new StringJoiner("), (", "(", ")");
// add...
// (123), (456), (789)
或者只使用收集器:
String s = Arrays.asList(123, 456, 789)
.stream()
.map(Object::toString)
.collect(Collectors.joining("), (", "(", ")"));
// (123), (456), (789)
最好使用准备好的语句,而不是使用字符串操作来构建查询。
推荐阅读
- websphere - 带有 Azure AD 的 WebSphere SAML SSO
- sonarqube - 由于 scm 忽略设置,Sonarqube 正在忽略文件,并且 JaCoCo XML Report Importer 将不导入任何覆盖信息
- java - -Djasypt.encryptor.password maven 的选项不起作用
- vuejs2 - Vue chartjs 没有从 API 渲染
- git - git merge 合并origin分支后去掉最新的代码
- html - 如何停止图像响应?
- enums - 在使用 kie 运行时在 DMN 中使用枚举会导致问题
- c# - 在 Xamarin.Forms 应用程序中使用 Azure.Identity 访问 Azure KeyVault
- .net - 如何将另一个表中的属性映射到 EF Core 中的模型?
- html - 响应式css移动断点,没有以一致的间隙占用全宽?