Hibernate 如何使用新值更新列值

Hibernate 如何使用新值更新列值,hibernate,Hibernate,我希望以增量方式使用新实体值更新列值,例如: 支持我有一个列名为BALANCE的表用户 对于特定用户,其余额为3000 现在,我想把他的值设为3500 我有一个hibernate用户实体,其“余额”值为500 如何进行更新 如果我想使用纯sql查询,我将简单地执行以下操作: 更新用户设置余额=余额+500,其中用户id=3 我希望避免调用sql而使用hibernate。这应该适合您: Query query = session.createQuery("UPDATE User u SET u.b

我希望以增量方式使用新实体值更新列值,例如:

支持我有一个列名为BALANCE的表用户

对于特定用户,其余额为3000

现在,我想把他的值设为3500

我有一个hibernate用户实体,其“余额”值为500

如何进行更新

如果我想使用纯sql查询,我将简单地执行以下操作:

更新用户设置余额=余额+500,其中用户id=3


我希望避免调用sql而使用hibernate。

这应该适合您:

Query query = session.createQuery("UPDATE User u SET u.balance = :balance WHERE u.id = :userId");
query.setParameter("balance", balance + 500);
query.setParameter("userId", 3);
query.executeUpdate();

请注意,您不是在通过HQL升级用户实体,也不是像使用SQL那样升级用户表。我还假设余额和id列映射到用户实体中的余额和id属性。

这应该适用于您:

Query query = session.createQuery("UPDATE User u SET u.balance = :balance WHERE u.id = :userId");
query.setParameter("balance", balance + 500);
query.setParameter("userId", 3);
query.executeUpdate();

请注意,您不是在通过HQL升级用户实体,也不是像使用SQL那样升级用户表。我还假设balance和id列映射到用户实体中的balance和id属性。

您尝试过下面的代码吗?在提出问题之前,一定要记得提及你尝试过的所有可能的解决方案

User user=session.get(User.class, 3); // 3 is ID of user. 
user.setBalance((user.getBalance()+500));
session.saveOrUpdate(user);
session.commit();

你试过下面的代码吗?在提出问题之前,一定要记得提及你尝试过的所有可能的解决方案

User user=session.get(User.class, 3); // 3 is ID of user. 
user.setBalance((user.getBalance()+500));
session.saveOrUpdate(user);
session.commit();

您可以通过以下方式使用JPA实现:

CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class);
Root<User> user = criteria.from(User.class);
criteria.set(user.<Integer>get("balance"), builder.sum(user.<Integer>get("balance"), 500));
criteria.where(builder.equal(user.get("user_id"), 3));
entityManager.createQuery(criteria).executeUpdate();
如果您想使用Hibernate执行此操作,那么我建议您使用锁定,就像使用Hibernate一样。您将首先选择行,在应用程序中更新余额,然后更新行。在select和update语句之间,如果行以不同的平衡进行更新,则最终会将不正确的数据写入数据库。因此,您可以使用以下代码来避免它:

User user = session.get(User.class, 3, LockMode.PESSIMISTIC_WRITE);
user.setBalance(user.getBalance() + 500);
session.saveOrUpdate(user);
它将对数据库执行以下查询:

UPDATE user SET balance = balance + 500 WHERE user_id = 3
SELECT * FROM user WHERE user_id = 3 FOR UPDATE #Let's assume current balance is 3000
UPDATE user SET balance = 3500 WHERE user_id=3

您可以通过以下方式使用JPA实现:

CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class);
Root<User> user = criteria.from(User.class);
criteria.set(user.<Integer>get("balance"), builder.sum(user.<Integer>get("balance"), 500));
criteria.where(builder.equal(user.get("user_id"), 3));
entityManager.createQuery(criteria).executeUpdate();
如果您想使用Hibernate执行此操作,那么我建议您使用锁定,就像使用Hibernate一样。您将首先选择行,在应用程序中更新余额,然后更新行。在select和update语句之间,如果行以不同的平衡进行更新,则最终会将不正确的数据写入数据库。因此,您可以使用以下代码来避免它:

User user = session.get(User.class, 3, LockMode.PESSIMISTIC_WRITE);
user.setBalance(user.getBalance() + 500);
session.saveOrUpdate(user);
它将对数据库执行以下查询:

UPDATE user SET balance = balance + 500 WHERE user_id = 3
SELECT * FROM user WHERE user_id = 3 FOR UPDATE #Let's assume current balance is 3000
UPDATE user SET balance = 3500 WHERE user_id=3

我不能做:query.setParameterbalance,balance+500;因为我没有余额,这个值应该来自DB。我所拥有的只是500,我想将其添加到数据库中现有的值3000中;因为我没有余额,这个值应该来自DB。我所拥有的只是500,我想把它加到数据库中现有的3000。是的,看起来很棒!非常感谢。若那个有效,那个么就接受这个答案,这样其他人就可以轻松搞定。是的,那个看起来很棒!非常感谢。若那个有效,那个么接受答案,这样其他人就可以很容易地修改它。你们也可以在冬眠状态下这样做。更新用户设置余额=+余额+500+,其中userId=3。或者将值设置为实体类,如user.setBalancebal+500。session.updateuseru也可以在hibernate中执行。更新用户设置余额=+余额+500+,其中userId=3。或者将值设置为实体类,如user.setBalancebal+500。session.updateuser