java.lang.String无法强制转换为[Ljava.lang.String;

时间:2016-09-22 11:56:37

标签: 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;
}

4 个答案:

答案 0 :(得分:6)

  

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[]>,因此当您尝试将值转换为{{1}时你得到这个例外。

根据Javadoc createNativeQuery(String),如果选择列表中只有一列,则返回类型String[]的结果或类型Object[]的结果。

方法#1

修复它的一种简单方法,可能是依靠原始类型来获得结果(这不是最优雅的方法,而是最简单的方法),之后您可以检查其类型列表内容正确地投射。

Object

然后检查类型,您可以按下一步继续:

List result = query.getResultList();

方法#2

更优雅的方法是创建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; ... } 并使用createNativeQuery(String sqlString, Class resultClass)来创建查询,这样它会自动使用POJO

以下是它的外观

POJO

答案 1 :(得分:0)

该行

ArrayList a = new ArrayList();

raw type,所以(potentailly)代码中的所有对象都可以被Object处理。

尝试

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

答案 2 :(得分:0)

在您的代码中的某个时刻,您正在尝试将String转换为String []。您的堆栈跟踪将告诉您确切的位置。

除此之外,您的代码还有很多其他问题。

答案 3 :(得分:0)

这样做:

List<String> resultList = (List<String>) query.getResultList();
if (!resultList.equals(Collections.emptyList())) {
    rowcount = resultList.size();
}

if (rowcount > 0) {
     colcount = resultList.get(0).length;
}