无法使用hibernate更新MySQL中的行

时间:2016-08-11 04:20:51

标签: java mysql hibernate

public class UpdateEmployee extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        PrintWriter out= response.getWriter();
        EmployeeDetails emp = new EmployeeDetails();
        SessionFactory fact=new Configuration().configure().buildSessionFactory();
        Session ses = fact.openSession();
        int emp_id = Integer.parseInt(request.getParameter("emp_id"));
        int new_emp_id = Integer.parseInt(request.getParameter("new_emp_id"));
        String emp_name = request.getParameter("name");
        String emp_designation_id = request.getParameter("designationid");
        String emp_skills = request.getParameter("skills");
        String emp_department_id = request.getParameter("departmentid");
        String emp_notes = request.getParameter("notes");
        String emp_email = request.getParameter("email");
        String emp_phone = request.getParameter("phone");
        String emp_username = request.getParameter("username");
        String emp_password = request.getParameter("password");
        emp.setEmp_department_id(emp_department_id);
        emp.setEmp_designation_id(emp_designation_id);
        emp.setEmp_email(emp_email);
        emp.setEmp_id(new_emp_id);
        emp.setEmp_join_date(null);
        emp.setEmp_name(emp_name);
        emp.setEmp_notes(emp_notes);
        emp.setEmp_password(emp_password);
        emp.setEmp_phone(emp_phone);
        emp.setEmp_skills(emp_skills);
        emp.setEmp_username(emp_username);
        Query query = ses.createQuery("update EmployeeDetails emp set emp_id=:new_emp_id,emp_name=:emp_name,emp_designation_id=:emp_designation_id,emp_skills=:emp_skills,emp_department_id=:emp_department_id,emp_notes=:emp_notes,emp_email=:emp_email,emp_phone=:emp_phone,emp_username=:emp_username,emp_password=:emp_password where emp_id=:emp_id");
        query.setParameter(emp_id, emp_id);
        query.setParameter(new_emp_id, new_emp_id);
        query.setParameter(emp_name, emp_name);
        query.setParameter(emp_designation_id, emp_designation_id);
        query.setParameter(emp_skills, emp_skills);
        query.setParameter(emp_department_id, emp_department_id);
        query.setParameter(emp_notes, emp_notes);
        query.setParameter(emp_email, emp_email);
        query.setParameter(emp_username, emp_username);
        query.setParameter(emp_password, emp_password);
        int result = query.executeUpdate();
        out.print(result);
    }

}

我尝试更新时的结果:

java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
    org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:55)
    org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:61)
    org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:382)
    org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:362)
    com.unisys.servlets.UpdateEmployee.doPost(UpdateEmployee.java:59)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我是hibernate的新手。我查了很多参考文献,非常感谢任何关于更新的指导。 我尝试使用emp_id值更新行中的一个值并更新数据库中的所有其他列。

2 个答案:

答案 0 :(得分:1)

是的,你是对的。但是这里的人将“命名”参数与索引参数概念混淆。

query.setParameter("emp_id", emp_id);
    query.setParameter("new_emp_id", new_emp_id);
    query.setParameter("emp_name", emp_name);
    query.setParameter("emp_designation_id", emp_designation_id);
    query.setParameter("emp_skills", emp_skills);
    query.setParameter("emp_department_id", emp_department_id);
    query.setParameter("emp_notes", emp_notes);
    query.setParameter("emp_email", emp_email);
    query.setParameter("emp_username", emp_username);
    query.setParameter("emp_password", emp_password);
    query.setParameter("emp_phone", emp_phone);
    int result = query.executeUpdate();

命名参数的主要目的是我们不用担心顺序,它易于理解和维护。

答案 1 :(得分:0)

java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!具有误导性。

在您的JPQL查询中,您将此条件emp_phone=:emp_phoneemp_phone参数一起使用,但参数值永远不会在查询中设置:

    Query query = ses.createQuery(
     "update EmployeeDetails emp set..emp_phone=:emp_phone");

    query.setParameter(emp_id, emp_id);
    query.setParameter(new_emp_id, new_emp_id);
    query.setParameter(emp_name, emp_name);
    query.setParameter(emp_designation_id, emp_designation_id);
    query.setParameter(emp_skills, emp_skills);
    query.setParameter(emp_department_id, emp_department_id);
    query.setParameter(emp_notes, emp_notes);
    query.setParameter(emp_email, emp_email);
    query.setParameter(emp_username, emp_username);
    query.setParameter(emp_password, emp_password);
    int result = query.executeUpdate();

因此,Hibernate会抛出异常。