这种情况下的Postgresql查询?

这种情况下的Postgresql查询?,postgresql,jdbc,Postgresql,Jdbc,我使用下面的语句 select * from table where column1 in(groups) 其中“groups”是大小为n的字符串数组。 如果我按原样使用它,它将不会被执行,那么有人能建议执行精确的查询吗? 编辑1 如果我使用以下代码 try{ System.out.println("before execute query"); ps1.setArray(1,conn.createArrayOf("text",gs)); ps1.setArray(2,con

我使用下面的语句

select * 
from table 
where column1 in(groups)
其中“groups”是大小为n的字符串数组。 如果我按原样使用它,它将不会被执行,那么有人能建议执行精确的查询吗?
编辑1
如果我使用以下代码

try{
   System.out.println("before execute query");
  ps1.setArray(1,conn.createArrayOf("text",gs));
  ps1.setArray(2,conn.createArrayOf("text",gs));
  System.out.println("after execute query");
  }
  catch(Exception e)
  {
   System.out.println("hrer----"+e);
  }
首先,它打印“在执行查询之前”,然后给出以下异常

javax.servlet.ServletException:servlet execution threw an exception
*注:*它不会在catch(异常e)块中打印“hrer-----”

除了你有
n
问号

StringBuilder q = new StringBuilder("select * from table where column1 in (");
for(int i=0; i<groups.length; i++) {
    q.append("?");
    if(i != groups.length - 1) {
        q.append(",");
    }
}
q.append(")");
PreparedStatement query = con.prepareStatement(q.toString());
for(int i=1; i<=groups.length; i++) {
    query.setString(i, groups[i-1]);
}
ResultSet rs = query.getResultSet();
StringBuilder q=newstringbuilder(“从列1所在的表中选择*”;
对于(int i=0;i
除了你有
n
问号

StringBuilder q = new StringBuilder("select * from table where column1 in (");
for(int i=0; i<groups.length; i++) {
    q.append("?");
    if(i != groups.length - 1) {
        q.append(",");
    }
}
q.append(")");
PreparedStatement query = con.prepareStatement(q.toString());
for(int i=1; i<=groups.length; i++) {
    query.setString(i, groups[i-1]);
}
ResultSet rs = query.getResultSet();
StringBuilder q=newstringbuilder(“从列1所在的表中选择*”;
对于(int i=0;i这应该可以:

PreparedStatement stmt = conn.prepareStatement(
    "SELECT * FROM users WHERE username = any(?)");

String[] usernames = {"admin", "guest"};
stmt.setArray(1, conn.createArrayOf("varchar", usernames));
鲍里斯在

上的回答值得称赞,这应该是可行的:

PreparedStatement stmt = conn.prepareStatement(
    "SELECT * FROM users WHERE username = any(?)");

String[] usernames = {"admin", "guest"};
stmt.setArray(1, conn.createArrayOf("varchar", usernames));


Boris在

上的回答值得称赞哦!不幸的是,你必须为
预处理语句
的每个参数给出一个
。你可能可以使用
StringUtils
或类似的工具来生成并加入
,这将使代码看起来更好。或者你可以切换到JPA,这允许你通过co查询的选项,甚至是本机查询(尽管每个集合有1000个对象的限制)。@beerbajay在java中有内置函数吗?@suraj没有,JDBC设计得非常简单,因此它没有提供很多方便的方法。每个参数都必须指定(例如,在准备好的语句中使用
)。这适用于大多数查询,但适用于()中的
查询时,它会变得杂乱无章。
的数量必须与集合的大小相匹配,因此您必须动态生成查询。正如我前面提到的,如果您使用JPA或hibernate,您可以将集合传递给这些查询。@suraj另一种选择是使用它,您可以将
列表传递给(例如)与JPA使用的格式相同(
其中(:paramName)
)中的column1。它应该是
query.setString(i,groups[i-1])
噢!很遗憾,您必须为
PreparedStatement
的每个参数提供一个
。您可能可以使用
StringUtils
或类似工具来生成并加入
,这将使代码看起来更好。或者您可以切换到JPA,它允许您将集合传递给查询,甚至是native查询(虽然每个集合有1000个对象的限制)。@beerbajay在java中有内置函数吗?@suraj没有,JDBC设计得非常简单,因此它没有提供很多方便的方法。每个参数都必须指定(例如,在准备好的语句中使用
)。这适用于大多数查询,但适用于()中的
查询时,它会变得杂乱无章。
的数量必须与集合的大小相匹配,因此您必须动态生成查询。正如我前面提到的,如果您使用JPA或hibernate,您可以将集合传递给这些查询。@suraj另一种选择是使用它,您可以将
列表传递给(例如)与JPA使用的格式相同(
其中(:paramName)
)中的column1。它应该是
query.setString(i,groups[i-1])
Oy,聪明!这只适用于postgres,但在OPs用例中可能没问题。@beerbajay为什么这只适用于postgresql?有什么具体原因吗?@sayap:当我使用上述查询时,它不会显示任何错误,但当我执行以下行“stmt.setArray(1,conn.createArrayOf(“varchar”,usernames))给出以下异常“javax.servlet.servletexception:servlet执行引发异常”。即使在catch(异常e)中,我也无法捕获此异常 block@beerbajay:为什么你说它只适用于postgresql?这里的哪一部分是特定于postgresql的?@Ashwin我有点错;它可能也适用于oracle。至少根据[JDBC教程](docs.oracle.com/javase/tutorial/JDBC/basics/array.html),
createArrayOf
,不适用于MySQL。Oy,聪明!这只适用于postgres,但在OPs用例中可能没问题。@beerbajay为什么这只适用于postgresql?有什么具体原因吗?@sayap:当我使用上述查询时,它不会显示任何错误,但当我执行以下行“stmt.setArray(1,conn.createArrayOf(“varchar”,usernames))给出以下异常“javax.servlet.servletexception:servlet执行引发异常”。即使在catch(异常e)中,我也无法捕获此异常 block@beerbajay:为什么你说它只适用于postgresql?这里的哪一部分是特定于postgresql的?@Ashwin我有点错;它可能也适用于oracle。至少根据[JDBC教程](docs.oracle.com/javase/tutorial/JDBC/basics/array.html),
createArrayOf
,在MySQL上不工作。@beerbajay:请查看edit@beerbajay:请查看编辑