大家。我是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。
答案 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
我建议你从现在开始这样做,因为你将获得以下好处:
在您的情况下,您只需要将query_All_Workers替换为:“from Worker”
。是的,就是这样!看起来很奇怪,但正如我之前所说,Hibernate正在处理所有转换;
完成后,假设您的Java类已正确映射到Hibernate实体,resultSet
这次将包含Workers,您可以使用Java getter方法从中轻松提取Ceh的名称:
worker.getCeh.getName();
同样使用HQL,您不需要再次选择Ceh表,只需获取名称,就像您现在需要做的那样。
希望有所帮助。