使用Hibernate原生SQL的addJoin时出现列不存在异常的解决方法
解决Hibernate原生SQL关联查询中"Column 'dept_no' not found"异常
我来帮你分析下这个问题,你遇到的Column 'dept_no' not found异常,核心原因是你的原生SQL查询没有返回Hibernate构建关联实体所需的关键字段,加上addJoin的使用依赖这些字段来建立关联关系,所以才会报错。
先梳理下你的场景:你使用Hibernate 5.2.8,Departamentos和Empleados是一对多/多对一的关联关系,执行原生SQL查询时用了addEntity和addJoin,但SQL仅返回了部分业务字段。
解决方案一:补全SQL必要字段,改用参数绑定
Hibernate处理addJoin时,需要获取Empleados的外键dept_no和Departamentos的主键dept_no来构建关联关系,所以你得把这两个字段加到查询列表里。另外,直接拼接字符串'"+dep+"'存在SQL注入风险,必须换成参数绑定:
Query q = session.createSQLQuery( "SELECT e.emp_no, e.apellido, e.oficio, d.dnombre, e.dept_no, d.dept_no " + "FROM empleados e inner join departamentos d on e.dept_no=d.dept_no " + "where d.dnombre LIKE :dep" ) .setParameter("dep", dep) // 参数绑定,避免SQL注入 .addEntity("e", jdbc.Empleados.class) .addJoin("d", "e.departamentos");
解决方案二:改用HQL查询(更推荐)
既然用了Hibernate,其实没必要写原生SQL,HQL会自动处理关联所需的字段,语法更简洁,也不容易出错:
String hql = "SELECT e.empNo, e.apellido, e.oficio, d.dnombre " + "FROM Empleados e JOIN e.departamentos d " + "WHERE d.dnombre LIKE :dep"; Query q = session.createQuery(hql) .setParameter("dep", dep);
报错原因详解
当你调用addJoin("d","e.departamentos")时,Hibernate期望从结果集中拿到:
Empleados实体的关联外键dept_noDepartamentos实体的主键dept_no
你的原始SQL只返回了e.emp_no,e.apellido,e.oficio, d.dnombre,缺少了关键的dept_no字段,Hibernate找不到这个字段来完成关联映射,所以抛出了SQL语法异常。
内容的提问来源于stack exchange,提问作者AnArribas
相关产品推荐
相关产品推荐

