1

I would like to update column value with a new entity value incrementally, for example:

support I have a table USER with COLUMN name BALANCE

for specific user, his balance is 3000.

Now, I would like to set his value to 3500.

I have hibernate "User" Entity that has a 'balance' value of 500.

How can I make the update??

If I would like to make it using pure sql query, I would simple do:

"UPDATE USER set balance = balance+500 where user_id=3"

I would like to avoid calling sql and use hibernate.

4

3 回答 3

4

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

User user=session.get(User.class, 3); // 3 is ID of user. 
user.setBalance((user.getBalance()+500));
session.saveOrUpdate(user);
session.commit();
于 2013-04-25T11:00:44.427 回答
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();

请不要说您是User通过 HQL 更新实体,而不是USER像使用 SQL 那样更新表。我还假设balanceid列映射到实体中的balanceid属性。User

于 2013-04-25T09:41:28.457 回答
1

您可以通过以下方式使用 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 您将首先选择行,更新应用程序中的余额,然后更新行。在选择和更新语句之间,如果行以不同的余额更新,那么您最终会将不正确的数据写入数据库。因此,您可以使用以下代码来避免它:

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
于 2018-12-16T10:11:57.287 回答