# ArrayList in Select



## dbit (13. Jun 2012)

hallo,
leider komme ich nicht weiter.
kann man ArrayList direkt in SQL statement irgendwie verwenden?
Z.B.:

```
String abfrage = "Select * from Tabelle where Feld in " + ArrayList;
```
:rtfm:
arraylist könnte über 1000 einträge beinhalten.
möchte mehrfachabfragen an die datenbank vermeiden.


----------



## VfL_Freak (13. Jun 2012)

Moin,

so in dieser Form sicher nicht!
Durch wirst dann ggf. schon durch die Liste laufen müssen und die einzelnen Inhalte zu Deinem String hinzufügen müssen ...

Was hast Du denn damit genau vor ?

Gruß
Klaus


----------



## dbit (13. Jun 2012)

ich muss aus einer datenbank eine liste holen und mit der aus
einer anderen abfragen. duschleifen will ich ja vermeiden(performance und last auf db).


----------



## knucki (13. Jun 2012)

Sind es tatsächlich 2 Datenbanken, 2 verschiedene Schemen auf einer DB oder 2 Tabellen?


```
String abfrage = "Select * from Tabelle where Feld in " + ArrayList;
```

Hier fehlen auf jeden Fall Klammern. Als Hilfe, könnte dir eine Methode dienen, mit der du aus einer ArrayList einen kommaseparierten String zurückbekommst...

private static String commaSeparatedListText(List<E> list){
  String text = "";
  for(E s:list){
    text += s.toString + ",";
  }
  return text.substring(0,text.length()-1);
}

Oder so


----------



## Gast2 (13. Jun 2012)

Wenn du prepared statements nutzt und statt der Liste nen Array hättest könntest du folgendes machen:


```
SELECT * FROM tabelle WHERE feld IN ?
```
Und dann folgende Methode nutzen:
PreparedStatement (Java 2 Platform SE v1.4.2)
Dann sollte dein Java Array zu nem SQL Array werden.

Händisch müsste das etwa so aussehen:

```
SELECT * FROM tabelle WHERE feld IN (1,2,3,4,5,6,7,8,9)
```
(wenn feld eine Integer Spalte ist)


----------



## dbit (13. Jun 2012)

@knucki, ja es sind zwei unterschiedlichen DB´s. aber dein ansatz ist interessant.
@EikeB, habe ich auch gedacht, aber ich habe noch nicht geprüft ob odbc/db das unterstützt. muss erst prüfen.

so jetzt erst ab ins lab.:rtfm:


----------



## dbit (2. Jul 2012)

EikeB hat gesagt.:


> Wenn du prepared statements nutzt und statt der Liste nen Array hättest könntest du folgendes machen:
> 
> 
> ```
> ...




Hallo EikeB,
irgendwie komme ich mit preparedstatement nicht weiter.

```
prestmt = con.prepareStatement(query);
```


```
prestmt.setArray(1, Teilenummer);
```
Teilenummer wird aus einer anderen Klasse geliefert.
ich bekomme immer diese Meldung:

##############################################
##############################################
##############################################
method setArray in interface java.sql.PreparedStatement cannot be applied to given types;
  required: int,java.sql.Array
  found: int,java.lang.String[]
  reason: actual argument java.lang.String[] cannot be converted to java.sql.Array by method invocation conversion	
##############################################
##############################################
##############################################


----------



## SlaterB (2. Jul 2012)

die Fehlermeldung ist doch vergleichsweise deutlich?

schaue dir an was PreparedStatement dort als Parameter verlangt
PreparedStatement (Java Platform SE 6)

ich selber habe das noch nicht benutzt, stehe mutmaßlich genau vor demselben Problem wie du,
scheitere ich auch oder bin ich einfach zu klug (und andersrum du dann zu ..)?  
wohl kaum bis auf einen Kniff und dann Frage des Fleiß:
mit 'preparedstatement setarray example' kann man in Suchmaschinen schnell was finden


----------



## Gast2 (2. Jul 2012)

Du musst der Methode ein 
	
	
	
	





```
java.sql.Array
```
 übergeben. Ob das bei dir so einfach geht weiß ich auch nicht.

Array (Java 2 Platform SE v1.4.2)


----------



## dbit (10. Jul 2012)

hallo.
wenn ich aus resultset ein array erzeuge 
	
	
	
	





```
sqlArray = rs.getArray(1);
```
 und
als parameter an die andere klasse übergeben 
	
	
	
	





```
prestmt.setArray(1, sqlArray);
```
 bekomme dann diese meldung:

Exception in thread "main" java.lang.UnsupportedOperationException
	at sun.jdbc.odbc.JdbcOdbcResultSet.getArray(JdbcOdbcResultSet.java:4396)


langsam komme ich ins schleudern.


----------



## Gast2 (10. Jul 2012)

Die Methode wird nicht unterstützt:



			
				http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/jdbc/odbc/JdbcOdbcResultSet.java.html hat gesagt.:
			
		

> ```
> public Array getArray (
> int i)
> throws SQLException
> ...


----------



## SlaterB (10. Jul 2012)

der Treiber scheint das einfach mal nicht zu unterstützen,

wobei das auch nicht eine IN-Liste zu sein scheint wie bisher angesprochen sondern ein Tabellen-Attribut-Typ
Using Array Objects (The Java™ Tutorials > JDBC(TM) Database Access > JDBC Basics)

und drittens schätze ich dass das nicht derart variabel in PreparedStatement geht, nein,

in Hibernate mit HQL-Query gibt es das
https://forum.hibernate.org/viewtopic.php?f=1&t=996006


----------



## dbit (10. Jul 2012)

EikeB hat gesagt.:


> Wenn du prepared statements nutzt und statt der Liste nen Array hättest könntest du folgendes machen:


also kann ich array doch nicht bei prepared statements nutzen?


----------

