Gio*_*gos 5 java jpa classcastexception
我有以下错误
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;
}
Run Code Online (Sandbox Code Playgroud)
java.lang.String不能转换为[Ljava.lang.String;
当您尝试将A强制转换String为的数组时,会发生此错误String。
例如:
List list = new ArrayList<>();
list.add("foo");
String[] values = (String[])list.get(0); -> throws the exception
Run Code Online (Sandbox Code Playgroud)
对我来说,您会收到此错误,因为query.getResultList()返回a List<String>或List<Object>而不是List<String[]>这样,当您尝试将值强制转换为a时String[],会出现此异常。
根据Javadoc,createNativeQuery(String)返回类型的结果,Object[]或者Object如果选择列表中只有一列,则返回类型的结果。
解决它的一种简单方法是依靠原始类型的结果(这不是最优雅的方法,而是最简单的方法),然后您可以检查列表内容的类型以正确地对其进行转换。
List result = query.getResultList();
Run Code Online (Sandbox Code Playgroud)
然后要检查类型,可以继续进行以下操作:
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;
...
}
Run Code Online (Sandbox Code Playgroud)
一种更优雅的方法是创建一个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();
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58887 次 |
| 最近记录: |