如何将数据库数据填充到JComboBox?Hibernate查询出现ClassCastException如何解决
问题根因
- HQL查询返回类型不匹配:你编写的HQL语句为
select dept_name from DepartmentTable,属于单独查询dept_name字段,返回的List中存储的是String类型的部门名称,不是DepartmentTable实体对象,你强行将元素转换为DepartmentTable类型直接触发了ClassCastException。 - 变量重复声明存在空指针隐患:你在
initialize方法中重新声明了局部变量JComboBox comboBox = new JComboBox();,没有给类层面定义的静态comboBox赋值,后续setCombobox方法操作的是未初始化的静态变量,还会额外触发NullPointerException。 - 补充:代码中未手动关闭Hibernate Session,会存在数据库连接资源泄漏的问题。
修复方案
方案1:修改HQL返回实体对象
如果后续可能需要用到部门的其他字段,可以调整查询逻辑返回完整实体:
private void setCombobox() { Session session = factory.openSession(); // 修改HQL直接查询整个实体 Query q = session.createQuery("from DepartmentTable"); List<DepartmentTable> list = q.list(); for (DepartmentTable dept : list) { comboBox.addItem(dept.getDept_name()); } session.close(); }
同时修改initialize方法,取消局部变量声明,直接给静态成员赋值:
private void initialize() { frame = new JFrame(); frame.setBounds(100, 100, 816, 408); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(null); // 直接给静态comboBox赋值,不要重复声明局部变量 comboBox = new JComboBox(); comboBox.setBounds(342, 55, 183, 35); frame.getContentPane().add(comboBox); }
方案2:保持现有HQL,调整集合泛型
如果只需要部门名称字段,不需要查询整个实体,就调整集合的泛型声明即可:
private void setCombobox() { Session session = factory.openSession(); Query q = session.createQuery("select dept_name from DepartmentTable"); // 匹配查询返回的String类型 List<String> list = q.list(); for (String deptName : list) { comboBox.addItem(deptName); } session.close(); }
同样需要同步修复comboBox变量重复声明的问题。
内容的提问来源于stack exchange,提问作者Harshada
相关产品推荐
相关产品推荐

