web-dev-qa-db-ja.com

java.lang.Stringは[Ljava.lang.String;にキャストできません。

次のものがあり、エラーが発生します

Java.lang.Stringは[Ljava.lang.String;にキャストできません。

次のエラーに直面したため、Object[]String[]に変更しました。

Java.lang.Objectは[Ljava.lang.String;にキャストできません。

何か案が?

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は[Ljava.lang.String;にキャストできません。

このエラーは、StringStringの配列にキャストしようとすると発生します。

例:

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

query.getResultList()が_List<String>_の代わりに_List<Object>_または_List<String[]>_を返すため、値を_String[]_としてキャストしようとすると、このエラーが発生します。この例外が発生します。


Javadocによると、 createNativeQuery(String )は、タイプ_Object[]_の結果、または選択リストに列が1つしかない場合はタイプObjectの結果を返します。

アプローチ#1

それを修正する1つの簡単な方法は、結果をrawタイプに依存することです(最もエレガントなアプローチではなく、最もシンプルなアプローチです)後でリストのコンテンツのタイプをチェックして、適切にキャストできます。

_List result = query.getResultList();
_

次に、タイプを確認するには、次の手順に進みます。

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

アプローチ#2

よりエレガントな方法は、POJOを作成し、 createNativeQuery(String sqlString, Class resultClass) を使用してクエリを作成することです。この方法では、列をPOJOのフィールドに自動的にマッピングします

これはどのように見えるかです

_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

次のようにします:

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

この線

ArrayList a = new ArrayList();

rawタイプ であるため、(潜在的に)コード内のすべてのオブジェクトはObjectとして処理されます。

試して

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

コードのある時点で、StringをString []にキャストしようとしています。スタックトレースにより、正確にどこにあるかがわかります。

それ以外にも、コードには他の多くの問題があります。

0
DaImmi