我有一个名单,例如:
List<String> names = ...
names.add('charles');
...
并声明:
PreparedStatement stmt =
conn.prepareStatement('select * from person where name in ( ? )');
如何执行以下操作:
stmt.setParameterList(1,names);
有解决方法吗?有人可以解释为什么这种方法丢失了吗?
使用:java,postgresql,jdbc3
答案 0 :(得分:19)
这个问题很陈旧,但没有人建议使用setArray
答案 1 :(得分:17)
只需在我知道的PreparedStatement
上设置一个列表,就没有干净的方法。
使用适当数量的问号(与列表中的数字相同)编写构造SQL语句(或更好地替换单个?或类似标记)的代码,然后遍历列表,为每个标记设置参数。 / p>
答案 2 :(得分:2)
对于postgres 9,我使用了这种方法:
jdbcTemplate.query(getEmployeeReport(), new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setTimestamp(1, new java.sql.Timestamp(from.getTime()));
ps.setTimestamp(2, new java.sql.Timestamp(to.getTime()));
StringBuilder ids = new StringBuilder();
for (int i = 0; i < branchIds.length; i++) {
ids.append(branchIds[i]);
if (i < branchIds.length - 1) {
ids.append(",");
}
}
// third param is inside IN clause
// Use Types.OTHER avoid type check while executing query
ps.setObject(3, ids.toString(), **Types.OTHER**);
}
}, new PersonalReportMapper());
答案 3 :(得分:1)
由于类型擦除,此方法缺失,因此List的参数类型在运行时丢失。因此需要添加几种方法:setIntParameters
,setLongParameters
,setObjectParameters
等
答案 4 :(得分:-1)
今天早上我正在审核代码,我的一位同事采用了不同的方法,只需使用setString("name1','name2','name3")
传递参数。
注意:我在开头和结尾跳过单引号,因为这些将由setString
添加。
答案 5 :(得分:-1)
在不同的论坛中检查各种解决方案而没有找到一个好的解决方案后,我觉得我想出的下面的黑客攻击,是最容易遵循和编码的。但请注意,这并没有使用准备好的查询,但无论如何都要完成工作:
示例:假设您有一个参数列表要传入&#39; IN&#39;条款。只需将一个虚拟字符串放入&#39; IN&#39;条款,比如,&#34; PARAM&#34; do表示将在此虚拟字符串的位置出现的参数列表。
select * from TABLE_A where ATTR IN (PARAM);
您可以将所有参数收集到Java代码中的单个String变量中。这可以按如下方式完成:
String param1 = "X";
String param2 = "Y";
String param1 = param1.append(",").append(param2);
在我们的案例中,您可以将所有以逗号分隔的参数附加到单个字符串变量&#39; param1&#39;中。
将所有参数收集到一个字符串后,您只需替换查询中的虚拟文本,即&#34; PARAM&#34;在这种情况下,使用参数String,即param1。以下是您需要做的事情:
String query = query.replaceFirst("PARAM",param1); where we have the value of query as
query = "select * from TABLE_A where ATTR IN (PARAM)";
您现在可以使用executeQuery()方法执行查询。只要确保你没有“#34; PARAM&#34;在你的查询任何地方。您可以使用特殊字符和字母的组合,而不是单词&#34; PARAM&#34;为了确保查询中不存在这样的单词。希望你能得到解决方案。
答案 6 :(得分:-2)
其他方法:
public void setValues(PreparedStatement ps) throws SQLException {
// first param inside IN clause with myList values
ps.setObject(1 , myList.toArray(), 2003); // 2003=array in java.sql.Types
}