【问题标题】:foreach loop runtime error, cast from List<Object[]> to Object[]foreach 循环运行时错误,从 List<Object[]> 转换为 Object[]
【发布时间】:2014-02-14 17:33:18
【问题描述】:

在尝试通过 JPA 从数据库中检索表并将其填充到 Table 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&lt;Object[]&gt; 时出错。我尝试了各种解决方案,但无法解决这个问题,因为我需要保留 Object[] 数组的选项,以便将所有行元素作为 SWT 表的项目供我使用。除了这行代码外,其他一切都很好。如果设置为for (Object row : tablelist),则没有数组。然后没有错误,但我丢失了数组,因此失去了将所有元素作为 SWT 表的项目供我使用的选项。

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

注意:SQL 查询“从测试 t 中选择 t”只是测试代码。我将使用一个参数来指定我以后需要哪些记录,所以这里会有不止一个表。

【问题讨论】:

  • 这是List&lt;Test&gt; 不是List&lt;Object[]&gt;。所以你需要修复List&lt;Object[]&gt; tablelist = query.getResultList(); 然后循环。
  • 已经试过了,结果一样。
  • @JoeBarr 你是否也改变了改变上述内容的 foreach 循环?
  • 是的,请阅读下面的 cmets,他们问同样的问题。只有没有数组的 Object 有效,Object[] 数组在运行时返回错误。
  • @JoeBarr:这就是错误消息所暗示的。但为了确定查询返回的内容,您可以在 connection.close(); 添加断点并检查变量 tablelist

标签: java arrays jpa swt runtime-error


【解决方案1】:

看起来tableList 包含Test 对象列表,而不是对象数组列表。这就是为什么当您将其更改为

for (Object row : tablelist)

代码有效。

尝试改变

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

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

改变

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

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

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

【讨论】:

  • 是的,我知道,但后来我丢失了行数组。代码是这样运行的,但现在必须将其更改为对象数组,无论它们是什么。它们是表格,您对表格 Test 中的信息是正确的。
  • 唯一的问题是 (Object[] row : tablelist),除了这一行之外,其他任何更改都有效。它只能作为对象而不是相同的数组。
  • 我不是这方面的专家,但我认为您必须创建一个对象来保存您返回的所有类型(表)。你看过这个stackoverflow问题吗? stackoverflow.com/questions/10807496/…
  • 其实是的。我的代码是这样设置的,但我决定强制转换它而不是发送参数类。它的工作原理相同,或者在我的情况下没有。
【解决方案2】:

这会起作用,异常也会告诉你出了什么问题。这里的测试是一个 JPA 类型,它是你的 typecast one line 2 不正确。您的类型转换强制将 List 转换为 List

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

【讨论】:

  • 对我来说 List tablelist = query.getResultList();不能保持 List。它说,将 tablelist 的类型更改为 List ,如果我改变它,我会再次回到方形。没有对象也没有数组。
  • 啊,我在编辑您的代码时错过了一个位置,您是对的,这是我在原始回复中提到的 List
  • @Bhasker 我设法解决了它,但现在我遇到了另一个错误。你愿意帮忙吗?
  • @JoeBarr 你为什么不问你的问题,我相信有人会回答,请随时在评论中联系我
  • @Bhasker 是的,我就是这个意思。
【解决方案3】:

我解决了这样的错误:

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

一切都在 SQL 查询中。我必须定义属性,而不是像这样选择所有属性:

"select t from Test t"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2019-05-28
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多