# Prepared Statement mehrere Zeichenketten



## willi (5. Jun 2007)

Moin!

Folgendes Statement-Beispiel:

"SELECT x, y FROM mytabelle WHERE x IN (?)"

Problem: Wie kann ich nu in das '?' mehrere Zeichenketten reinkriegen? Also z. B. soll da rein 'ja', 'nein', 'vielleicht'. 

Wenn ich das per 


```
setString (1, " 'ja', 'nein', 'vielleicht' ")
```

mache, klappt es nicht! Leider ist die Anzahl der Zeichenkette variabel. Also kann ich auch nicht mehrere Fragezeichen reinkloppen. Habs auch schon mit escapen der Hochkommas versucht, leider ohne Erfolg. Und somit hoffe ich auf die kompetente Hilfe hier im Forum!

Besten Dank im Voraus.

willi


----------



## SlaterB (5. Jun 2007)

setParameterList oder so


----------



## willi (5. Jun 2007)

SlaterB hat gesagt.:
			
		

> setParameterList oder so



guter gedanke, gibst aber leider net!


----------



## SlaterB (5. Jun 2007)

tatsächlich, ist ja lustig, bei Hibernate gibts das, 

also entweder direkt hinschreiben
"SELECT x, y FROM mytabelle WHERE x IN ('a', ..)" 

oder dynamischer durch eigene Komponenten nachbauen,
wenn dir ein etwas chaotischer Code zusagt:


```
/**
     * Erzeugt einen Teil der HQL-Anfrage, eine Liste mit IN ( ) für eine Menge von
     * Strings (ohne Anführungszeichen, für Zahlen und Parameter geeignet).
     * 
     * @param _attribute
     * @param _parts
     *            zu berücksichtigende Inhalte
     * @return String
     */
    public static String getInList(String _attribute, Object... _parts)
    {
        return getInList(false, _attribute, _parts);
    }

    /**
     * Erzeugt einen Teil der HQL-Anfrage, eine Liste mit IN ( ) für eine Menge von
     * Strings (deren toString(), mit Anführungszeichen, für Zeichenketten geeignet)
     * 
     * @param _attribute
     * @param _parts
     *            zu berücksichtigende Inhalte
     * @return String
     */
    public static String getInListStrings(String _attribute, Object... _parts)
    {
        return getInList(true, _attribute, _parts);
    }

    /**
     * Erzeugt einen Teil der HQL-Anfrage, eine Liste mit IN ( ).
     * 
     * @param _string
     * @param _attribute
     * @param _parts
     *            zu berücksichtigende Inhalte
     * @return String
     */
    public static String getInList(boolean _string, String _attribute, Object... _parts)
    {
        Object[] parts = getObjectArray(_parts);

        StringBuilder b = new StringBuilder("( ");
        int begin = 0;
        int partListLength = 900;
        // kein IN (...) mit mehr als 900 Elementen, mag Hibernate bei > 1000 nicht mehr
        while (parts.length - begin > 0)
        {
            int end = Math.min(parts.length, begin + partListLength);

            if (b.length() > 3)
            {
                b.append(" OR ");
            }
            b.append(_attribute);
            b.append(" IN ( ");

            // p("begin: "+begin+", end: "+end+", "+parts.length);
            b.append(getList(_string, begin, end, parts));
            begin = end;
            b.append(" ) ");
        }
        b.append(") ");

        return b.toString();
    }

    /**
     * Erzeugt eine komma-getrennte Liste für ein Array von Objekten.
     * 
     * @param _parts
     *            zu berücksichtigende Inhalte
     * @return String
     */
    public static String getList(Object... _parts)
    {
        return getList(false, 0, -1, _parts);
    }

    /**
     * Erzeugt eine komma-getrennte Liste für ein Array von Objekten (deren toString()).
     * 
     * @param _string
     * @param _begin
     * @param _end
     * @param _parts
     *            zu berücksichtigende Inhalte
     * @return String
     */
    public static String getList(boolean _string, int _begin, int _end, Object... _parts)
    {
        Object[] parts = getObjectArray(_parts);
        int end = _end;
        if (end < 1 || end > parts.length)
        {
            end = parts.length;
        }
        int begin = _begin;
        if (begin < 1)
        {
            begin = 0;
        }
        StringBuilder b = new StringBuilder("");
        for (int i = begin; i < end; i++)
        {
            if (i > begin)
            {
                b.append(", ");
            }
            if (_string)
            {
                b.append("'");
            }
            b.append(parts[i]);
            if (_string)
            {
                b.append("'");
            }
        }
        return b.toString();
    }

    /**
     * Gibt ein Object-Array zum Object-Array-Parameter zurück. Erstellt ein Object-Array,
     * sofern eine einzelne Collection übergeben wurde.
     * 
     * @param _objects
     * @return Object[]
     */
    public static Object[] getObjectArray(Object... _objects)
    {
        if (Helper.isEmpty(_objects))
        {
            throw new IllegalArgumentException("empty Object-Array");
        }
        Object[] objects = _objects;
        if (objects.length == 1 && (Collection.class.isInstance(objects[0])))
        {
            Collection c = (Collection)objects[0];
            objects = new Object[c.size()];
            int i = 0;
            for (Object o : c)
            {
                objects[i] = o;
                i++;
            }
        }
        return objects;

    }
```


----------



## willi (5. Jun 2007)

habs grad auch mit so nem workaround gemacht. sieht zwar nicht gut aus und war auch nicht gerade im sinne des erfinders, aber erfüllt seinen zweck. 
ich bastel des prepared statement dynamisch auf und fülle dann entsprechend viele '?' ein, wie ich dann parameter haben. dann wird das prepared statement auf die db losgelassen und dann kann ich ordentlich befüllen.
nich schön, aber geht!

besten dank!!!


----------

