6

我有一个表“用户”,有很多列,其中两个是“用户名”和“密码”用户名是主键列

我想更新用户名的密码。这是我的代码,它工作正常(没有错误或异常)但没有更新密码。

我是 Hibernate 的新手,不太了解它的语法。请帮我

 String query = "UPDATE users SET Password = '"+ newPassword +"' WHERE Username = '"+ login.getUsername() + "'";

 session.createSQLQuery(query);

login.getUsername() 正在正确获取所需的用户名

其余代码工作正常问题在上面的代码中。

4

3 回答 3

11

您刚刚创建了一个查询,但尚未执行它:

SQLQuery sqlQuery = session.createSQLQuery(query);
sqlQuery.executeUpdate();

注意

  • 您应该使用命名参数而不是连接参数。这将防止 SQL 注入攻击,或者当密码或用户名包含'
  • 在 Hibernate 中,您通常使用以下方式执行这些简单的操作:

-

User u = session.get(User.class, userName);
u.setPassword(newPassword);
于 2012-06-08T12:19:28.087 回答
3

您只是忘记了执行方法,它们:

String query = "UPDATE users SET Password = '"+ newPassword +"' WHERE Username = '"+            login.getUsername() + "'";
try {
    s.getTransaction().begin();
    s.createSQLQuery(query).executeUpdate();
    s.getTransaction().commit();
    s.close();
}
catch (HibernateException erro){
    s.getTransaction().rollback();
    s.close();
} 

我强烈建议您不要使用连接参数来防止 SQL 注入攻击,或者仅仅是取决于您的字符串的错误。看看HQLCriteria

于 2014-04-03T13:24:47.310 回答
0

希望这可以帮助像我这样的人

如果我们直接对一个字段进行更新,它会将所有其他字段设置为其默认值。

Session session = factory.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.password("xxxxx");
session.update(user);
tx.commit();
session.close();

上面的代码将所有其他字段设置为默认值。所以为了避免这种情况,我们必须从表中获取对象,然后修改它并执行更新操作。

我们可以使用session.loadsession.get获取对象并更新它。

代码

User u = session.load(User.class, userName);
u.setPassword(newPassword);

或者

User u = session.get(User.class, userName);
u.setPassword(newPassword);

然后需要执行session.update(user)

完整代码:

        SessionFactory factory = hibernateUtils.getSessionFactory();
        Session session = factory.openSession();
        Transaction tx = session.beginTransaction();
        User user = session.load(User.class, username);
        user.setPassword("xxxxxx");
        session.update(user);
        tx.commit();
        session.close();
于 2020-01-05T17:24:47.490 回答