2013-07-24 94 views
23

我看過,並且一直無法找到我遇到的以下挑戰的答案。它 似乎很簡單,但我一直無法解決它。如何使用arraylist作爲準備好的語句參數

我有一個ArrayList的記錄ID是Long - >ArrayList<Long>。我想用 這個記錄ID列表從另一個表中選擇行。到現在爲止還挺好。現在進入 挑戰...

a)我正在使用準備好的語句從ArrayList輸入 爲表中選擇數據。

selectPS = dbConnection.prepareStatement("select columnA from tableA where id in ?"); 

上述問題 - 如何定義參數?上述內容對於 和ArrayList類型參數似乎不正確。

b)設置 聲明的參數值時,我也遇到了問題。沒有設置ArrayList類型值的方法,我看不到其他可行的 選項。

---> selectPS.set?????(1, arraylistParameter); 
    ResultSet rs = selectPS.executeQuery(); 

任何幫助或方向,你可以設置我非常感謝。

謝謝。

+0

**你可以嘗試傳遞數組嗎?**,[PreparedStatement#setArray()](http://docs.oracle。com/javase/7/docs/api/java/sql/PreparedStatement.html#setArray(int,java.sql.Array))?您需要首先使用[Connection#createArrayOf()](http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#createArrayOf(java.lang.String, java.lang.Object中[]))。列出某些方法[here](http://www.javaranch.com/journal/200510/Journal200510.jsp#a2)。 – NINCOMPOOP

+0

我會動態地爲數組中的每個元素創建一個帶'?'的字符串,每個值調用'setLong'方法,每次增加索引。 –

+0

@Thomas Grady CBIP你的數據庫是什麼?如果是Oracle,那麼將不會在'IN'子句中支持超過1000條記錄。您必須編寫INNER JOIN子句更多信息 - http://stackoverflow.com/questions/4722220/sql-in-clause-1000-項目限制 – Prabhaker

回答

32

您可能需要使用setArray方法如下javadoc中提到:

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int, java.sql.Array)

示例代碼:

PreparedStatement pstmt = 
       conn.prepareStatement("select * from employee where id in (?)"); 
Array array = conn.createArrayOf("VARCHAR", new Object[]{"1", "2","3"}); 
pstmt.setArray(1, array); 
ResultSet rs = pstmt.executeQuery(); 
+0

@Yogendra ...我研究了你的建議,但無法讓它與Long一起工作。一旦我解決了手頭的生產問題,我將進一步研究這一建議。謝謝。 –

+10

找回你(和TNI)關於使用數組的建議。不幸的是我不能使用這個,因爲我們有MySQL作爲我們的數據庫。 MySQL不支持一個sql數組。這太糟糕了,因爲這也解決了我的需求。感謝您的幫助。 –

+0

我基本上使用這段代碼,但是我得到一個'text = text []'錯誤。是否有可能顯示結果查詢會是什麼? 我期待如下所示:'SELECT * FROM employee where id('{「1」,「2」,「3」}')'就像我在代碼中一樣。 –

13

如果你有ArrayList的然後轉換成數組[對象]

ArrayList<String> list = new ArrayList<String>(); 
PreparedStatement pstmt = 
      conn.prepareStatement("select * from employee where id in (?)"); 
Array array = conn.createArrayOf("VARCHAR", list.toArray()); 
pstmt.setArray(1, array); 
ResultSet rs = pstmt.executeQuery(); 
-9

爲什麼使生活變得硬

String parameters = StringUtils.join(arraylistParameter.iterator(),","); 
PreparedStatement pstmt =conn.prepareStatement("select * from employee 
         where id in ("+ parameters+)"); 
+9

因爲SQL注入 – TameHog

-1

@JulienD 最好的辦法是突破過程分爲兩個步驟。

第1步: 可以說'rawList'作爲您希望添加爲準備語句中參數的列表。

再創建一個列表:

ArrayList<String> listWithQuotes = new ArrayList<String>(); 

for(String element : rawList){ 
    listWithQuotes.add("'"+element+"'"); 
} 

步驟2: 使 'listWithQuotes' 逗號分隔。

String finalString = StringUtils.join(listWithQuotes.iterator(),","); 

'finalString'將字符串參數與每個元素作爲單引號和逗號分隔。

+0

這是一個壞主意,因爲它會打開你的SQL注入。 –

相關問題