次のものがあり、エラーが発生します
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;
}
Java.lang.Stringは[Ljava.lang.String;にキャストできません。
このエラーは、String
をString
の配列にキャストしようとすると発生します。
例:
_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つの簡単な方法は、結果を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;
...
}
_
よりエレガントな方法は、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();
...
}
_
次のようにします:
List<String> resultList = (List<String>) query.getResultList();
if (!resultList.equals(Collections.emptyList())) {
rowcount = resultList.size();
}
if (rowcount > 0) {
colcount = resultList.get(0).length;
}
この線
ArrayList a = new ArrayList();
rawタイプ であるため、(潜在的に)コード内のすべてのオブジェクトはObject
として処理されます。
試して
ArrayList<String[][]> a = new ArrayList<>();
コードのある時点で、StringをString []にキャストしようとしています。スタックトレースにより、正確にどこにあるかがわかります。
それ以外にも、コードには他の多くの問題があります。