2012-06-14 122 views
1

我使用下面的语句Postgresql查询这种情况?

select * 
from table 
where column1 in(groups) 

其中,“组”是大小为n的String数组。 如果我使用它,它不会得到执行,所以任何人都可以提出确切的查询来执行此操作吗?
编辑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 -----”块

+0

@beerbajay:请参见编辑 – suraj

+0

@sayap请参阅编辑 – suraj

回答

2
select * from table where column1 in (?, ?) 

除了你有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(); 
+1

... java代码是真的不整齐。 – zinking

+0

我知道,只是有办法让这段代码看起来更好吗? – zinking

+0

哦!那么,不幸的是,你必须为'PreparedStatement'的每个参数提供'?'。你可以使用'StringUtils'或类似的方式来生成和加入''',这会使代码看起来更好。或者你可以切换到JPA,它允许你将集合传递给查询,甚至是本地查询(尽管每个集合有1000个对象的限制)。 – beerbajay

3

这应该工作:

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

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

幸得鲍里斯的答案在https://stackoverflow.com/a/10240302

+0

Oy,聪明!这只会在postgres上工作,但在OPs用例可能没问题。 – beerbajay

+1

@beerbajay为什么这只适用于postgresql?任何特定的原因? – suraj

+0

@sayap:当我使用上面的查询,它不显示任何错误,但是当我执行以下行“stmt.setArray(1,conn.createArrayOf(”varchar“,usernames));”给出以下异常“javax.servlet.servletexception:servlet执行扔了一个异常“。我甚至无法捕捉到这个异常,即使在catch(异常e)块 – suraj