如何在JAVA中从字符串数组列表创建带单引号的逗号分隔字符串

20

我有一个在Java中向MS SQL发送查询的需求,类似于:

select * from customer 
where customer.name in ('abc', 'xyz', ...,'pqr');

但是我有一个以String类型的ArrayList形式给出的IN子句值,例如:列表看起来像{"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();

但这个列表像是"abc,xyz,..,pqr",我想要它变成"'abc','xyz',..,'pqr'",这样我可以将其传递给准备语句。

如何在Java中做到这一点而不使用GUAVA辅助库。

提前致谢!


我无法检查,但是 String list= StringUtils.join(namesList, "','"); 怎么样? - rzysia
7个回答

22

我知道这是一个非常旧的帖子,但以防有人正在寻找如何在Java 8中实现这个功能:

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

20
List<String> nameList = ...    
String result = nameList.stream().collect(Collectors.joining("','", "'", "'"));

1
如果你熟悉Java 8流,我认为这是最好和最短的答案。 - Jitendra Singh

8

要将字符串转换,您可以尝试以下方法:

String list= StringUtils.join(namesList, "','");
list = "'" + list + "'";

但我认为将一个字符串用于多个参数并不是一个好主意。


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();

1
您可以使用一个简单的分隔符来完成这种活动。本质上,您需要一个对象,在第一次请求时评估为 "",但在第一次请求后更改以返回一个定义好的字符串。
public class SimpleSeparator<T> {
  private final String sepString;
  boolean first = true;

  public SimpleSeparator(final String sep) {
    this.sepString = sep;
  }

  public String sep() {
    // Return empty string first and then the separator on every subsequent invocation.
    if (first) {
      first = false;
      return "";
    }
    return sepString;
  }

  public static void main(String[] args) {
    SimpleSeparator sep = new SimpleSeparator("','");
    System.out.print("[");
    for ( int i = 0; i < 10; i++ ) {
      System.out.print(sep.sep()+i);
    }
    System.out.print("]");
  }

}

1
我使用流(stream)按照以下方式进行了操作。几乎相同,但稍微简短了一些。
 nameList = List.of("aaa", "bbb", "ccc")
                .stream()
                .map(name -> "'" + name + "'")
                .collect(Collectors.joining(","));

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - bradley101

0

我想最简单的方法是使用表达式语言,就像这样:

 String[] strings = {"a", "b", "c"};
 String result = ("" + Arrays.asList(strings)).replaceAll("(^.|.$)", "\'").replace(", ", "\',\'" );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接