【问题标题】:how to create comma separated string in single quotes from arraylist of string in JAVA如何在 JAVA 中的字符串数组列表中用单引号创建逗号分隔的字符串
【发布时间】:2015-03-12 13:53:03
【问题描述】:

我需要在 Java 中触发类似 MS SQL 的查询

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

但我有这个字符串数组列表形式的 IN 子句值。例如:列表看起来像 {"abc","xyz",...,"pqr"}

我创建了一个Prepared Statement:

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

list 类似于 "abc,xyz,..,pqr",但我希望它为 "'abc','xyz', ..,'pqr'" 这样我就可以将它传递给 Prepares 语句。

如何在没有 GUAVA 帮助程序库的情况下在 JAva 中进行操作。

提前致谢!!

【问题讨论】:

  • 我查不出来,但是String list= StringUtils.join(namesList, "','");呢?

标签: java arrays arraylist


【解决方案1】:

即使您按照自己的意愿格式化字符串,它也不起作用。您不能将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();

【讨论】:

    【解决方案2】:

    要转换字符串,你可以试试这个:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以对此类活动使用简单的分隔符。本质上,您想要一个对象在第一次时评估为“”,但在第一次请求返回定义的字符串后发生变化。

        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("]");
          }
        
        }
        

        【讨论】:

          【解决方案5】:

          我知道这是一篇很老的帖子,但以防万一有人正在寻找您如何以 Java 8 方式执行此操作:

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

          【讨论】:

            【解决方案6】:
            List<String> nameList = ...    
            String result = nameList.stream().collect(Collectors.joining("','", "'", "'"));
            

            【讨论】:

            • 我认为这是您熟悉 Java 8 流的最佳和最短的答案
            【解决方案7】:

            我按照以下方式使用流进行了操作。几乎相同,但更短一些。

             nameList = List.of("aaa", "bbb", "ccc")
                            .stream()
                            .map(name -> "'" + name + "'")
                            .collect(Collectors.joining(","));
            

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多