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

时间:2015-05-16 11:52:46

标签: java swing object derby

我编写了这段代码,将jTable设置为一个模型,以适应从我的查询返回的数据。我不确定为什么会这样,但我确实有一个使用相同代码的例子,它完美地工作。  注意:查询从链接到另一个表的表中调用记录。  注意:有些人可能会说这是一个重复的问题,但我觉得不是因为我看到了这个问题并且没有解决方案帮助了我,我尝试使用迭代器而是发生了同样的错误。 任何建议。

这是代码

public void createModelsAndEquipmentTableModel(){
        Query query = FinancialDBPUEntityManager.createQuery("SELECT t FROM Stocktbl t WHERE t.chemical = FALSE");
        List<Object[]> results = query.getResultList();
        String headings[] = {"Product ID", "Product Name", "Number In Stock", "Number Needs Replacing"};
        Object data[][] = new Object[results.size()][headings.length];
        int index = 0;
        for(Object[] obj: results){// error occurs here.
            data[index++] = obj;
        }
        DefaultTableModel model = new DefaultTableModel(data, headings);
        tblquipment.setModel(model);
    }

这是堆栈跟踪的相关部分:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: GUIPac.Stocktbl cannot be cast to [Ljava.lang.Object;
    at GUIPac.ViewStockInfo.createChemicalsTableModel(ViewStockInfo.java:53)
    at GUIPac.ViewStockInfo.<init>(ViewStockInfo.java:30)

2 个答案:

答案 0 :(得分:4)

查询"SELECT t FROM Stocktbl t WHERE t.chemical = FALSE"将返回Stocktbl个对象。 迭代ResultList时会导致ClassCastExceptions。

我建议使用这个createQuery-Method:

    TypedQuery<Stocktbl> query = FinancialDBPUEntityManager.createQuery("SELECT t FROM Stocktbl t WHERE t.chemical = FALSE", Stocktbl.class);

然后解决所有编译器警告和错误。

如果需要对象阵列,则在使用JPA时必须手动生成对象阵列。这是一个用于创建这些对象数组的伪代码:

    for(Stocktbl stock : results){// no error occurs here anymore.
        Object[] obj = new Object[] {stock.ProductId, stock.ProductName, stock.NumberInStock, stock.numberNeedsReplacing};
        data[index++] = obj;
    }

请更改Stocktbl stock的字段名称以适合您的Stocktbl

答案 1 :(得分:2)

getResultList() - 方法返回List<Stocktbl>而不是Object[]的列表。

在运行时没有通用。但是当你迭代它时,演员会失败。