我有以下错误
我已将Object[]
更改为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;
}
最佳答案
当您尝试将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[]
类型的结果或Object
类型的结果。方法#1
解决此问题的一种简单方法是,使用原始类型来获得结果(这不是最优雅的方法,但也是最简单的方法),然后您可以检查列表内容的类型以正确地进行转换。
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一种更优雅的方法是创建一个
Entity
类并使用 createNativeQuery(String sqlString, Class entityClass)
创建您的查询,这样它将自动将您的列与Entity
的字段进行映射这是它的样子
private Collection<T> queryStatement(String SelectStatement, Class<T> resultType) {
...
Query query = getEntityManager().createNativeQuery(SelectStatement, resultType);
List<T> resultList = (List<T>) query.getResultList();
...
}