web-dev-qa-db-fra.com

java.lang.String ne peut pas être converti en [Ljava.lang.String;

J'ai le suivant et j'ai l'erreur 

Java.lang.String ne peut pas être converti en [Ljava.lang.String;

J'ai changé le Object[] en String[] parce que j'ai été confronté à l'erreur suivante: 

Java.lang.Object ne peut pas être converti en [Ljava.lang.String;

Une idée?

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 ne peut pas être converti en [Ljava.lang.String;

Cette erreur se produit lorsque vous essayez de convertir une String en un tableau de String.

Par exemple:

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

Pour moi, vous obtenez cette erreur parce que query.getResultList() renvoie un List<String> ou List<Object> au lieu de List<String[]>, de sorte que lorsque vous essayez de convertir une valeur en String[], vous obtenez cette exception.


Selon la Javadoc createNativeQuery (String ) renvoie un résultat de type Object[] ou un résultat de type Object s'il n'y a qu'une seule colonne dans la liste de sélection.

Approche n ° 1

Un moyen simple de résoudre ce problème pourrait consister à utiliser le type raw pour obtenir le résultat (ce n'est pas l'approche la plus élégante, mais la plus simple). Vous pourrez ensuite vérifier le type du contenu de la liste à diffuser. correctement.

List result = query.getResultList();

Ensuite, pour vérifier le type, vous pouvez procéder comme suit:

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;
    ...
}

Approche n ° 2

Une manière plus élégante pourrait être de créer une POJO et d’utiliser createNativeQuery(String sqlString, Class resultClass) pour créer votre requête. Ainsi, il mappera automatiquement vos colonnes avec les champs de votre POJO

Voici à quoi ça pourrait ressembler

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

Fait comme ça:

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

La ligne

ArrayList a = new ArrayList();

est un raw type et ainsi (potentailly) tous les objets du code pourraient être traités comme Object.

Essayer

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

À un moment donné de votre code, vous essayez de convertir une chaîne en chaîne []. Votre trace de pile vous dira où exactement.

En dehors de cela, votre code a beaucoup d'autres problèmes.

0
DaImmi