java.lang.String 不能强制转换为 [Ljava.lang.String;

2022-09-02 10:32:34

我有以下内容,但我收到错误

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

答案 1

java.lang.String 不能强制转换为 [Ljava.lang.String;

当您尝试将 a 强制转换为 的数组时,会发生此错误。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[]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

一种更优雅的方法可能是创建一个类并使用createNativeQuery(String sqlString,Class entityClass)来创建查询,这样它会自动将您的列与您的字段进行映射。EntityEntity

这是它可能看起来像

private Collection<T> queryStatement(String SelectStatement, Class<T> resultType) {
    ...
    Query query = getEntityManager().createNativeQuery(SelectStatement, resultType);
    List<T> resultList = (List<T>) query.getResultList();
    ...
}

答案 2

生产线

ArrayList a = new ArrayList();

是原始类型,因此(有潜力地)代码中的所有对象都可以作为 。Object

尝试

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

推荐