如何在JAVA中从字符串的arraylist中用单引号创建逗号分隔的字符串

Lon*_*olf 6 java arrays arraylist

我在Java中要求在MS SQL上触发查询

select * from customer 
where customer.name in ('abc', 'xyz', ...,'pqr');
Run Code Online (Sandbox Code Playgroud)

但是我有这个IN子句值以StringList的形式出现.例如:列表看起来像{"abc","xyz",...,"pqr"}

我创建了一份准备好的声明:

 PreparedStatement pStmt = conn.prepareStatement(select * from customer 
    where customer.name in (?));
String list= StringUtils.join(namesList, ",");
pStmt.setString(1,list);
rs = pStmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

但是列表就像"abc,xyz,..,pqr",但我希望它为"'abc','xyz',..,'pqr'", 以便我可以将它传递给Prepares Statement.

如何在JAva中使用GUAVA帮助程序库来完成它.

提前致谢!!

Igo*_*ock 21

List<String> nameList = ...    
String result = nameList.stream().collect(Collectors.joining("','", "'", "'"));
Run Code Online (Sandbox Code Playgroud)


Jon*_*gel 9

我知道这是一个非常古老的帖子,但万一有人正在寻找如何以Java 8方式做到这一点:

private String join(List<String> namesList) {
    return String.join(",", namesList
            .stream()
            .map(name -> ("'" + name + "'"))
            .collect(Collectors.toList()));
}
Run Code Online (Sandbox Code Playgroud)


Sza*_*pul 5

要转换字符串,您可以尝试:

String list= StringUtils.join(namesList, "','");
list = "'" + list + "'";
Run Code Online (Sandbox Code Playgroud)

但我不认为为多个参数传递一个字符串是个好主意.


Era*_*ran 3

即使您按照自己的意愿格式化字符串,它也不起作用。您无法将 中的一个占位符替换为PreparedStatement多个值。

您应该动态构建占位符PreparedStatement,使其具有与输入列表中的元素一样多的占位符。

我会做这样的事情:

StringBuilder scmd = new StringBuilder ();
scmd.append ("select * from customer where customer.name in ( ");
for (int i = 0; i < namesList.size(); i++) {
  if (i > 0)
    scmd.append (',');
  scmd.append ('?');
}
scmd.append (")");
PreparedStatement stmt = connection.prepareStatement(scmd.toString());

if (namesList.size() > 0) {
    for (int i = 0; i < namesList.size(); i++) {
        stmt.setString (i + 1, namesList.get(i));
    }
}
rs = stmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)