简体   繁体   中英

how to create comma separated string in single quotes from arraylist of string in JAVA

I have requirement in Java to fire a query on MS SQL like

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

But I have this IN clause values in the form of ArrayList of String. For ex: the list look like {"abc","xyz",...,"pqr"}

I created a 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();

But the list is like "abc,xyz,..,pqr" , but I want it as "'abc','xyz',..,'pqr'" so that I can pass it to Prepares Statement.

How to do it in JAva with out GUAVA helper libraries.

Thanks in Advance!!

I know this is a really old post but just in case someone is looking for how you could do this in a Java 8 way:

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

For converting the string you can try this:

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

But i dont thing it's a good idea to pass one string for multiple params.

Even if you formatted the String as you wish, it won't work. You can't replace one placeholder in the PreparedStatement with multiple values.

You should build the PreparedStatement dynamically to have as many placeholders as there are elements in your input list.

I'd do something like this :

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();
List<String> nameList = ...    
String result = nameList.stream().collect(Collectors.joining("','", "'", "'"));

You can use a simple separator for this type of activity. Essentially you want an object that evaluates to "" the first time around but changes after the first request to return a defined string.

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

}

I guess the simplest way to do it is using expression language like that:

 String[] strings = {"a", "b", "c"};
 String result = ("" + Arrays.asList(strings)).replaceAll("(^.|.$)", "\'").replace(", ", "\',\'" );
nameList = List.of("aaa", "bbb", "ccc")
            .stream()
            .map(name -> "'" + name + "'")
            .collect(Collectors.joining(","));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM