如何动态地将字符串数组传递给Java中的SQL“IN”子句?

时间:2013-11-29 05:12:14

标签: java sql

我有一些带有特定值的字符串“String []”数组。我想动态地将该数组传递给SQL“IN”子句,如:

Select * from Employee where emp_name in (?);

这里“?”必须用String Array替换。我想在Java Class中这样做。我试过

Array array = conn.createArrayOf("VARCHAR", new Object[]{"1", "2","3"});
pstmt.setArray(1, array);

但是它没有工作并且获得异常“SQLFeatureException”。

感谢!!!

3 个答案:

答案 0 :(得分:2)

基本上,字段emp_name不是数组而是VARCHAR,所以当你为它设置一个值时,它必须是一个字符串。因此,查询中只有1 ?表示emp_name的单个可能值。你必须列出尽可能多的?作为数组的长度,并用它们的值单独替换它们。

假设empNames是String[],您可以这样做以准备查询:

StringBuilder query = new StringBuilder("Select * from Employee where emp_name in (");
for (int i = 0; i < empNames.length; i++) {
  if (i > 0) {
    query.append(",");
  }
  query.append("?");
}
query.append(")");

这将设置?的背后的个别值:

for (int i = 0; i < empNames.length; i++) {
  pstmt.setString(i+1, empNames[i]);
}

答案 1 :(得分:1)

我们可以应用选择批处理来解决您的问题。参考:

link

答案 2 :(得分:0)

您可以使用StringBuilder通过迭代String数组来创建带有IN子句的查询。

我建议不要使用Arrays.toString()的复杂性,除非你真的需要它。性能没有太大差异,因为需要迭代数组以创建String文字。

在我的方法中,我们可以很好地控制数组的迭代,添加单引号逗号等。