无法强制转换Hibernate

时间:2018-03-19 07:05:24

标签: java hibernate

我正在使用Hibernate访问数据并将数据记录到数据库中。

在我使用HQL连接映射表并从数据库查询某些对象之前,一切都很好。结果,我得到了List<Object[]>包含的数据。但是当我得到Object数组时,出现了异常

  

线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException:com.aperture.demo.entities.Order无法强制转换为[Ljava.lang.Object;
  在com.aperture.demo.controller.MainAppController $ OrderTableMouseListener.mouseClicked(MainAppController.java:113)       在java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)       at java.awt.Component.processMouseEvent(Component.java:6536)       在javax.swing.JComponent.processMouseEvent(JComponent.java:3324)       at java.awt.Component.processEvent(Component.java:6298)       at java.awt.Container.processEvent(Container.java:2237)       at java.awt.Component.dispatchEventImpl(Component.java:4889)       at java.awt.Container.dispatchEventImpl(Container.java:2295)       at java.awt.Component.dispatchEvent(Component.java:4711)       at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)       at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)       at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)       at java.awt.Container.dispatchEventImpl(Container.java:2281)       at java.awt.Window.dispatchEventImpl(Window.java:2746)       at java.awt.Component.dispatchEvent(Component.java:4711)       at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)       at java.awt.EventQueue.access $ 500(EventQueue.java:97)       at java.awt.EventQueue $ 3.run(EventQueue.java:709)       at java.awt.EventQueue $ 3.run(EventQueue.java:703)       at java.security.AccessController.doPrivileged(Native Method)       at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)       at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)       at java.awt.EventQueue $ 4.run(EventQueue.java:733)       at java.awt.EventQueue $ 4.run(EventQueue.java:731)       at java.security.AccessController.doPrivileged(Native Method)       at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)       at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)       at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)       at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)       at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)       在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我已经尝试过任何方式,例如,使List Iterable,将Object []转换为Order [](我的对象),但结果是相同的。我使用IDE的Debugger,但看起来很好,就像这个

View post on imgur.com

(Stack Overflow不允许我在这里嵌入图片,抱歉!)

我不明白“[L”是什么意思,为什么它会让我的项目崩溃。

我的对象

@Entity
@Table(name = "orders")
public class Order extends MyObject implements Serializable {
    //something
}

从DB

获取对象的方法
public List<Object[]> listJoinedTable(int id) {

    Transaction tx = null;
    List<Object[]> result = null;
    try (Session session = sessionFactory.openSession()) {
        tx = session.beginTransaction();
        //language=HQL
        String hql = "SELECT o FROM Order o INNER JOIN FETCH o.productList WHERE o.orderId = " + id;
        result = session.createQuery(hql).list();
        tx.commit();
    } catch (HibernateException e) {
        if (tx != null) tx.rollback();
        e.printStackTrace();
    }
    return result;
}

触发错误的代码

if (mouseEvent.getButton() == MouseEvent.BUTTON1) {
            final JTable target = (JTable) mouseEvent.getSource();
            final int row = target.getSelectedRow();
            final int id = (int) mainAppFrame.getOrderList()
                    .getModel()
                    .getValueAt(0, 0);
            List<Object[]> recordList = ((AdvancedLoader<Order>) orderLoader).listJoinedTable(id);
            for (int i = 0; i < recordList.size(); i++) {
                Order[] myObjects = (Order[]) recordList.get(i); //Bug here
            }
        }

请帮助我,非常感谢!

2 个答案:

答案 0 :(得分:0)

&#34; [L&#34;表示该对象是long的数组,您应该使用集合来接收结果。

答案 1 :(得分:0)

感谢XtremeBaumer,我解决了这个问题。 Hibernate很擅长返回你需要的类的对象(堡盟说),所以我们不需要使用List。只需使用List即可获得所需的对象。我用对象Product映射了对象Order,所以当我加入两个表时,我只得到一个对象是Order。如果您加入一些完全未映射的表,您可能仍需要List。