如何使用新值更新列值

时间:2013-04-25 09:31:58

标签: hibernate

我想以递增方式使用新的实体值更新列值,例如:

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

对于特定用户,他的余额是3000。

现在,我想将他的值设置为3500。

我已暂停“平衡”值为500的“用户”实体。

如何进行更新?

如果我想使用纯SQL查询,我会很简单:

“UPDATE USER set balance = balance + 500 where user_id = 3”

我想避免调用sql并使用hibernate。

3 个答案:

答案 0 :(得分:3)

你试过下面的代码吗?在提问之前,请务必记住您尝试过的所有可能的解决方案。

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

答案 1 :(得分:1)

这应该适合你:

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更新User实体,而不是像使用SQL那样更新USER表。我还假设balanceid列已映射到balance实体中的idUser属性。

答案 2 :(得分:0)

您可以通过以下方式使用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();

它将对数据库执行以下查询:

UPDATE user SET balance = balance + 500 WHERE user_id = 3

如果您想使用Hibernate进行操作,那么我将建议您使用锁定方式,就像使用Hibernate一样,您将首先选择该行,在Application中更新余额,然后更新该行。在select和update语句之间,如果行以不同的余额进行更新,则最终将错误的数据写入数据库。因此,您可以使用以下代码来避免这种情况:

User user = session.get(User.class, 3, LockMode.PESSIMISTIC_WRITE);
user.setBalance(user.getBalance() + 500);
session.saveOrUpdate(user);

它将对数据库执行以下查询:

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