2013-07-24 1 views
23

Ho cercato e non sono riuscito a trovare una risposta alla seguente sfida che sto avendo. Lo sembra piuttosto semplice ma non sono stato in grado di risolverlo.Come utilizzare un arraylist come parametro di istruzione preparato

Possiedo un ArrayList di ID record di tipo Long ->ArrayList<Long>. Vorrei utilizzare questo elenco di ID record per selezionare le righe da un'altra tabella. Fin qui tutto bene. Ora sulla sfida ...

a) Sto usando una dichiarazione preparata per selezionare i dati da una tabella utilizzando il ArrayList come input per questo.

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

Domanda su quanto sopra: come deve essere definito il parametro? Quanto sopra non sembra corretto per un parametro di tipo ArrayList.

b) Si verificano anche problemi durante l'impostazione del valore del parametro per l'istruzione preparata. Non esiste un metodo per impostare un valore di tipo ArrayList e non vedo altre valide opzioni .

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

Qualsiasi aiuto o direzione in cui mi puoi iscrivere è molto apprezzato.

Grazie.

+0

** Puoi provare a passare un array? **, [PreparedStatement # setArray()] (http://docs.oracle.it/javase/7/docs/api/java/sql/PreparedStatement.html # setArray (int, java.sql.Array))? È necessario creare prima un array usando [Connection # createArrayOf()] (http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#createArrayOf (java.lang.String, java.lang.Object [])). Ci sono alcuni modi elencati [qui] (http://www.javaranch.com/journal/200510/Journal200510.jsp#a2). – NINCOMPOOP

+0

Creerei dinamicamente una stringa con un '?' Per ogni elemento dell'array, chiamiamo il metodo 'setLong' con ogni valore, incrementando l'indice ogni volta. –

+0

@Thomas Grady CBIP Qual è il tuo database? Se è Oracle, non supporterà più di 1000 record nella clausola 'IN'. Devi scrivere la clausola JOIN INNER più informazioni - http://stackoverflow.com/questions/4722220/sql-in-clause-1000- item-limit – Prabhaker

risposta

32

Si consiglia di utilizzare setArray metodo, come indicato nel javadoc di seguito:

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

codice di esempio:

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 ... Ho esaminato il tuo suggerimento ma non sono riuscito a farlo funzionare con Long. Ho intenzione di approfondire questo suggerimento una volta che avrò affrontato il problema della produzione. Grazie. –

+10

Tornando a te (e al TNI) sul suggerimento di usare un array. Purtroppo non posso usarlo a causa del fatto che abbiamo MySQL come nostro database. MySQL non supporta un array SQL. E 'un peccato perché questo avrebbe indirizzato anche il mio bisogno. Grazie per il tuo aiuto. –

+0

Fondamentalmente sto usando questo codice, tuttavia sto ricevendo un errore 'text = text []'. Sarebbe possibile mostrare quale sarebbe la query di risultato? Mi aspetto qualcosa del genere: 'SELECT * FROM impiegato dove id in ('{" 1 "," 2 "," 3 "}')' come fa nel mio codice. –

13

Se hai ArrayList poi convertire in Array [Oggetto ]

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

perché fare la vita hardware

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

Perché SQL Injection – TameHog

-1

@JulienD Il modo migliore è quello di rompere al di sopra processo in due fasi.

Fase 1: Diciamo 'rawList' come l'elenco che si desidera aggiungere come parametri in dichiarazione preparata.

creare un altro elenco:

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

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

Fase 2: virgola Marchio 'listWithQuotes' separato.

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

'finalString' saranno parametri di stringa con ciascun elemento come quotati singoli e separati da virgola.

+0

Questa è una cattiva idea, perché ti aprirà all'iniezione SQL. –