foreach循环运行时错误,从List <object []>强制转换为Object [] </object []>

时间:2014-01-23 22:21:42

标签: java arrays jpa swt runtime-error

尝试通过JPA从数据库中检索表并将其填入表SWT窗口小部件( org.eclipse.swt.widgets.Table )时,执行以下Java代码时出现转换错误:

EntityManager connection = DB.Connection().createEntityManager(); //the EntityManagerFactory
TypedQuery<Object[]> query = (TypedQuery<Object[]>) connection.createQuery("select t from Test t"); 
List<Object[]> tablelist = query.getResultList();
connection.close();

SWTtable.removeAll(); //clears all the elements in the table

for (Object[] row : tablelist) { //error on this line - java.lang.ClassCastException: {packagename}.Test cannot be cast to [Ljava.lang.Object;
    final TableItem item = new TableItem(SWTtable, SWT.None);
    item.setData(row[0]);
    item.setText(0, row[1].toString());
}

如上所示,此行for (Object[] row : tablelist) {返回错误java.lang.ClassCastException: {packagename}.Test cannot be cast to [Ljava.lang.Object;

似乎在foreach循环中投放tablelist时出现List<Object[]>Object[] row的错误。我已经尝试了各种解决方案,但无法解决这个问题,因为我需要保留Object[]数组的选项,以便将所有行元素作为SWT表的项目。除了这行代码之外,其他所有工作正常。如果它设置为for (Object row : tablelist),那么没有数组。然后没有错误,但是我丢失了数组,因此失去了将我所有的元素作为SWT表的项目的选项。

如果这是一种不好的方法,并且您有其他建议,请指明。

注意:SQL查询“从测试t中选择t”只是测试代码。我将使用参数来指定稍后需要的记录,因此这里将有多个表。

3 个答案:

答案 0 :(得分:0)

看起来tableList包含Test个对象的列表,而不是Object数组的列表。这就是为什么当你把它改成

for (Object row : tablelist)

代码有效。

尝试更改

List<Object[]> tablelist = query.getResultList();

List<Test> tablelist = query.getResultList();

并更改

for (Object[] row : tablelist) {
    ...
}

for (Test row : tablelist) {
    ...
}

您必须更改for-loop中的代码才能使用Test对象而不是Object[]。在不知道Test对象的含义的情况下,我很难告诉你如何做到这一点。但我认为Test对象应该包含您尝试从数组中检索的所有信息,因为这是您返回信息的方式。

答案 1 :(得分:0)

这会起作用,例外也告诉你出了什么问题。这里测试的是JPA类型,你的类型是第2行是不正确的。您的类型转换正在强制列表&lt;测试&gt;到列表&lt;对象[]&gt;。

javadoc Execute a SELECT query and return the query results as a typed List.

item.setDataitem.setText应在row

中调用正确的属性访问者
EntityManager connection = DB.Connection().createEntityManager(); //the EntityManagerFactory
TypedQuery<Test> query = (TypedQuery<Test>) connection.createQuery("select t from Test t"); 
List<Test> tablelist = query.getResultList();
connection.close();

SWTtable.removeAll(); //clears all the elements in the table

for (Test row : tablelist) { //error on this line - java.lang.ClassCastException {packagename}.Test cannot be cast to [Ljava.lang.Object;
    final TableItem item = new TableItem(SWTtable, SWT.None);
    item.setData(row.getSomeAttribute());
    item.setText(0, row.getSomeOtherAttribute());
}

答案 2 :(得分:0)

我解决了这样的错误:

"select t.id, t.first, t.second, t.last from Test t"

它完全在SQL查询中。我必须定义属性,而不是只选择所有属性:

"select t from Test t"