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;
}
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.
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;
...
}
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();
...
}
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;
}
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<>();
À 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.