如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]
Posted
技术标签:
【中文标题】如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]【英文标题】:How to pass array of strings dynamically to SQL "IN" clause in Java? [duplicate] 【发布时间】:2013-12-15 05:43:57 【问题描述】:我有一个包含特定值的字符串数组“String[]”。我想将该数组动态传递给 SQL“IN”子句,例如:
Select * from Employee where emp_name in (?);
这里“?”必须用字符串数组替换。我想在 Java 类中做到这一点。我试过了
Array array = conn.createArrayOf("VARCHAR", new Object[]"1", "2","3");
pstmt.setArray(1, array);
但它不起作用并出现异常“SQLFeatureException”。
谢谢!!!
【问题讨论】:
另见PreparedStatement with list of parameters in a IN clause,其中链接了很多骗子。 【参考方案1】:您可以通过使用 StringBuilder 迭代字符串数组来创建带有 IN 子句的查询。
我建议不要使用Arrays.toString()
的复杂性,除非你真的需要它。性能不会有太大差异,因为两者都需要迭代数组以创建 String
文字。
在我的方法中,我们可以很好地控制数组的迭代,添加单引号和逗号等。
【讨论】:
上述解决方案有效。我只想避免该循环,并希望将“ABC”、“DFD”、“ss”等字符串传递给“?” ..这可能吗【参考方案2】:我们可以应用选择批处理来解决您的问题。参考:
link
【讨论】:
仅链接答案无效:)【参考方案3】:基本上,字段 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]);
【讨论】:
以上是关于如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]的主要内容,如果未能解决你的问题,请参考以下文章