webentwicklung-frage-antwort-db.com.de

java.lang.String kann nicht in [Ljava.lang.String;

Ich habe folgendes und ich bekomme die Fehlermeldung 

Java.lang.String kann nicht in [Ljava.lang.String;

Ich habe den Object[] in String[] geändert, da der nächste Fehler aufgetreten ist: 

Java.lang.Object kann nicht in [Ljava.lang.String;

Irgendeine Idee?

private Collection queryStatement(String SelectStatement) {

    int colcount = 0;
    int rowcount = 0;
    int rowcounter = 0;

    ArrayList a = new ArrayList();

    Query query = getEntityManager().createNativeQuery(SelectStatement);

    List<String[]> resultList = (List<String[]>) query.getResultList();

    if (!resultList.equals(Collections.emptyList())) {
        rowcount = resultList.size();
    }

    if (rowcount > 0) {
        colcount = ((String[]) query.getResultList().get(0)).length;
    }

    rows = rowcount;
    cols = colcount;

    String[][] array = new String[rowcount][colcount];

    for (String[] obj : resultList) {
        String[] record = new String[colcount];
        for (int colCounter = 0; colCounter < colcount; colCounter++) {
            record[colCounter] = safeValue(obj[colCounter]+"");
        }

        array[ rowcounter++] = (String[]) record;
    }
    a.add(array);
    return a;
}
4
Giorgos

Java.lang.String kann nicht in [Ljava.lang.String;

Dieser Fehler tritt auf, wenn Sie versuchen, eine String in ein Array von String umzuwandeln.

Zum Beispiel:

List list = new ArrayList<>();
list.add("foo");
String[] values = (String[])list.get(0); -> throws the exception

Sie erhalten diese Fehlermeldung für mich, weil query.getResultList() einen List<String> oder List<Object> anstelle von List<String[]> zurückgibt, sodass Sie diese Ausnahme erhalten, wenn Sie versuchen, einen Wert als String[] zu konvertieren.


Entsprechend dem Javadoc gibt createNativeQuery (String ) ein Ergebnis vom Typ Object[] oder ein Ergebnis vom Typ Object zurück, wenn sich in der Auswahlliste nur eine Spalte befindet.

Ansatz Nr. 1

Eine einfache Möglichkeit, dies zu beheben, könnte darin bestehen, sich auf den raw-Typ für das Ergebnis zu verlassen (es ist nicht der eleganteste Ansatz, sondern der einfachste). Später können Sie den Typ des Inhalts der Liste prüfen, der umgewandelt werden soll es richtig.

List result = query.getResultList();

Um den Typ zu überprüfen, können Sie als nächstes fortfahren:

if (resultList.isEmpty() || resultList.get(0) instanceof Object[]) {
    // Several columns in the result
    List<Object[]> resultList = (List<Object[]>) result;
    // The rest of your current code here
} else {
    // Only one column in the result
    List<Object> resultList = (List<Object>) result;
    ...
}

Ansatz Nr. 2

Eine elegantere Methode könnte die Erstellung einer POJO und die Verwendung von createNativeQuery(String sqlString, Class resultClass) zum Erstellen Ihrer Abfrage sein. Auf diese Weise werden Ihre Spalten automatisch den Feldern Ihrer POJO zugeordnet.

So könnte es aussehen

private Collection<T> queryStatement(String SelectStatement, Class<T> resultType) {
    ...
    Query query = getEntityManager().createNativeQuery(SelectStatement, resultType);
    List<T> resultList = (List<T>) query.getResultList();
    ...
}
4
Nicolas Filotto

Mach das so:

List<String> resultList = (List<String>) query.getResultList();
if (!resultList.equals(Collections.emptyList())) {
    rowcount = resultList.size();
}

if (rowcount > 0) {
     colcount = resultList.get(0).length;
}
0
Nimesh

Die Linie

ArrayList a = new ArrayList();

ist ein raw-Typ und so (potentiell) könnten alle Objekte im Code als Object bezeichnet werden.

Versuchen

ArrayList<String[][]> a = new ArrayList<>();
0
OldCurmudgeon

Sie versuchen irgendwann in Ihrem Code, einen String in String [] umzuwandeln. Ihr Stack-Trace zeigt Ihnen genau wo.

Abgesehen davon hat Ihr Code viele andere Probleme.

0
DaImmi