2013-07-24 22 views
23

Szukałem i nie byłem w stanie znaleźć odpowiedzi na następujące wyzwanie, które mam. To wydaje się dość proste, ale nie byłem w stanie go rozwiązać.Jak korzystać z listy tablic jako przygotowanego parametru instrukcji

Mam ArrayList identyfikatorów rekordów typu Long ->ArrayList<Long>. Chciałbym użyć tej listy identyfikatorów rekordów, aby wybrać wiersze z innej tabeli. Jak na razie dobrze. Teraz na wyzwanie ...

a) Używam przygotowanej instrukcji, aby wybrać dane z tabeli, używając ArrayList jako danych wejściowych .

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

Pytanie powyżej - jak powinien być zdefiniowany parametr? Powyższe nie wydaje się poprawne dla parametru typu i .

b) Występują również problemy przy ustawianiu wartości parametru dla przygotowanej instrukcji . Nie ma metody ustawiania wartości typu ArrayList i nie widzę innych możliwych do zastosowania opcji .

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

Każda pomoc lub kierunek, w którym możesz mnie ustawić, jest bardzo doceniana.

Dziękuję.

+0

** Czy możesz spróbować przekazać tablicę? **, [PreparedStatement # setArray()] (http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html # setArray (int, java.sql.Array))? Najpierw musisz utworzyć tablicę za pomocą [Connection # createArrayOf()] (http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#createArrayOf (java.lang.String, java.lang.Object [])). Wymienione są pewne sposoby [tutaj] (http://www.javaranch.com/journal/200510/Journal200510.jsp#a2). – NINCOMPOOP

+0

Chciałbym dynamicznie utworzyć ciąg z '?' Dla każdego elementu w tablicy, wywołać metodę 'setLong' z każdą wartością, za każdym razem zwiększając indeks. –

+0

@Thomas Grady CBIP Jaka jest twoja baza danych? Jeśli jest to Oracle, to nie obsługuje więcej niż 1000 rekordów w klauzuli "IN". Musisz napisać klauzulę INNER JOIN więcej informacji - http://stackoverflow.com/questions/4722220/sql-in-clause-1000- item-limit – Prabhaker

Odpowiedz

32

Możesz użyć setArray metody wymienione w poniższej javadoc:

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

Przykładowy kod:

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 ... Sprawdziłem twoją sugestię, ale nie mogłem jej użyć do długiego. Zamierzam dalej badać tę sugestię, gdy zajmiemy się problemem produkcji. Dzięki. –

+10

Wracając do ciebie (i TNI) o sugestii użycia tablicy. Niestety nie mogę tego użyć, ponieważ mamy MySQL jako naszą bazę danych. MySQL nie obsługuje tablicy sql. Szkoda, bo to również zaspokoiłoby moją potrzebę. Dziękuję za twoją pomoc. –

+0

Zasadniczo używam tego kodu, jednak otrzymuję błąd 'text = text []'. Czy byłoby możliwe pokazanie, czym będzie zapytanie wynikowe? Spodziewałem się czegoś takiego: 'SELECT * FROM employee gdzie id in ('{" 1 "," 2 "," 3 "}')' jak to robi w moim kodzie. –

13

Jeśli masz ArrayList następnie przekształcić Array [Object ]

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

dlaczego czyni życie Sprzet

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

Ponieważ SQL Injection – TameHog

-1

@JulienD Najlepszym sposobem jest przerwa powyżej procesu na dwa etapy.

Krok 1:Powiedzmy "rawList" jako twoja lista, którą chcesz dodać jako parametry w przygotowanym wyciągu.

Utwórz kolejną listę:

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

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

Krok 2: przecinek Make listWithQuotes 'rozdzielone.

"finalString" będzie parametrem łańcuchowym z każdym elementem jako pojedynczy cytat i rozdzielany przecinkami.

+0

To jest zły pomysł, ponieważ spowoduje to otwarcie do SQL injection. –