如何在准备好的语句中设置参数列表?

时间:2009-08-20 10:28:57

标签: java postgresql jdbc prepared-statement

我有一个名单,例如:

List<String> names = ...
names.add('charles');
...

并声明:

PreparedStatement stmt = 
  conn.prepareStatement('select * from person where name in ( ? )');

如何执行以下操作:

stmt.setParameterList(1,names);

有解决方法吗?有人可以解释为什么这种方法丢失了吗?

使用:java,postgresql,jdbc3

7 个答案:

答案 0 :(得分:19)

这个问题很陈旧,但没有人建议使用setArray

这个答案可能有助于https://stackoverflow.com/a/10240302/573057

答案 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的参数类型在运行时丢失。因此需要添加几种方法:setIntParameterssetLongParameterssetObjectParameters

答案 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
}