我在Java中要求在MS SQL上触发查询,如
select * from customer
where customer.name in ('abc', 'xyz', ...,'pqr');
但我有这个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();
但列表就像“abc,xyz,..,pqr”,但我希望它为“'abc','xyz', .., 'PQR'“ 所以我可以将它传递给Prepares Statement。
如何使用GUAVA帮助程序库在JAva中执行此操作。
先谢谢!!
答案 0 :(得分:8)
我知道这是一个非常古老的帖子,但万一有人正在寻找如何用Java 8方式做到这一点:
private String join(List<String> namesList) {
return String.join(",", namesList
.stream()
.map(name -> ("'" + name + "'"))
.collect(Collectors.toList()));
}
答案 1 :(得分:5)
要转换字符串,您可以尝试:
String list= StringUtils.join(namesList, "','");
list = "'" + list + "'";
但我不认为为多个参数传递一个字符串是个好主意。
答案 2 :(得分: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();
答案 3 :(得分:2)
List<String> nameList = ...
String result = nameList.stream().collect(Collectors.joining("','", "'", "'"));
答案 4 :(得分:1)
您可以为此类活动使用简单的分隔符。基本上你想要一个评估为&#34;&#34;的对象。第一次,但在第一次请求返回定义的字符串后更改。
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 :(得分:0)
我想最简单的方法是使用这样的表达式语言:
String[] strings = {"a", "b", "c"};
String result = ("" + Arrays.asList(strings)).replaceAll("(^.|.$)", "\'").replace(", ", "\',\'" );