2012-06-14 166 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