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

标签 java jpa classcastexception

我有以下内容,但出现错误

java.lang.String cannot be cast to [Ljava.lang.String;

我已将 Object[] 更改为 String[] 因为我遇到了下一个错误:

java.lang.Object cannot be cast to [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 cannot be cast to [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[] 时你得到这个异常(exception)。


根据 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();
    ...
}

关于java.lang.String 无法转换为 [Ljava.lang.String;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39638394/

相关文章:

java - 无法调用 Tomcat 管理器

JavaMonkey Canvas

java - Datanucleus RDBMS JPA 带依赖项的 jar

java - Sonal lint : change this condition so that it does not always evaluate to true

java - ServerSocket 接受方法 - 如何向下转换为子类类型?

java - 如何在 C 中实现 Java 接口(interface)方法

java - 如何在 Java Annotation 中设置整数数组

java - JPA:容器管理的实体管理器何时被清除或关闭?

java.lang.ClassCastException : org. bson.types.ObjectId 无法转换为 com.mongodb.DBObject

android - 使用 bundle 通过 Intent 发送 2D 数组时出现 ClassCastException