尝试通过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”只是测试代码。我将使用参数来指定稍后需要的记录,因此这里将有多个表。
答案 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.setData
和item.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"