无法将查询结果转换为实体

时间:2015-05-24 14:25:23

标签: java sql-server swing hibernate

大家。我是Hibernate的新手。我正在制作桌面应用程序。我有2个表:Worker和Ceh(即Department)。它们之间的关系:多对一,即1 Ceh可能包含许多工人。 我使用内部联接运行hql查询以显示有关所有工作人员的信息,包括部门名称,并希望在JTable中显示结果。

hql查询:

private static String query_All_Workers="select W.fio, W.nomer, W.salary, C.name from Worker W Inner Join W.ceh C;

运行查询的方法:

   try {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Query q = session.createQuery(hql);
        List resultList = q.list();
        displayResult(resultList);
        session.getTransaction().commit();
    } catch (HibernateException he) {
        he.printStackTrace();
    }

方法displayResult(List resultList):

Vector<String> tableHeaders = new Vector<>();
    tableHeaders.add("FIO"); 
    tableHeaders.add("Nomer");
    tableHeaders.add("Salary");
    tableHeaders.add("Ceh");

    Vector tableData = new Vector();
    for(Object o : resultList) {
        Worker worker = (Worker)o;
        Vector<Object> oneRow = new Vector<Object>();
        oneRow.add(worker.getFio());
        oneRow.add(worker.getNomer());
        oneRow.add(worker.getSalary());
        oneRow.add(worker.getCeh());
        tableData.add(oneRow);
    }
    resultTable.setModel(new DefaultTableModel(tableData, tableHeaders));

异常发生如下:

  

&#34; java.lang.ClassCastException:[Ljava.lang.Object;无法施展   workers.entity.Worker&#34;

发生这种情况是因为列表包含内部联接查询结果的对象。因此,我不知道如何正确地将对象转换为Worker实体以使用其getter。

1 个答案:

答案 0 :(得分:0)

您正在获取“java.lang.ClassCastException”,因为您正在尝试将java.lang.Object类型的对象强制转换为自定义类Worker:

Worker worker = (Worker)o;

您尝试做的事情没有任何问题,只需确保结果集实际返回Worker,但事实并非如此。在您的示例中,您将返回resultSet个对象,因为您正在编写常规JDBC select SQL语句。

为了解决这个问题,您需要检查Hibernate的查询语言(HQL)语法并编写HQL查询而不是常规的JDBC查询。

这里的快速教程http://www.tutorialspoint.com/hibernate/hibernate_query_language.htm

我建议你从现在开始这样做,因为你将获得以下好处:

  1. 当您使用HQL编写select语句(或任何其他语句)时,您会考虑并使用Java对象,而不是DB表(它对表外键映射有很大帮助);
  2. HQL返回整个Java对象,因为Hibernate将为您进行必要的转换。
  3. 在您的情况下,您只需要将query_All_Workers替换为:“from Worker”。是的,就是这样!看起来很奇怪,但正如我之前所说,Hibernate正在处理所有转换;

    完成后,假设您的Java类已正确映射到Hibernate实体,resultSet这次将包含Workers,您可以使用Java getter方法从中轻松提取Ceh的名称: worker.getCeh.getName();

    同样使用HQL,您不需要再次选择Ceh表,只需获取名称,就像您现在需要做的那样。

    希望有所帮助。