首页 > 解决方案 > 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适合在哪里呢?

标签: javastring

解决方案


使用现有代码,最简单的方法是将括号添加到分隔符:

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)

最好使用准备好的语句,而不是使用字符串操作来构建查询。


推荐阅读