我想以递增方式使用新的实体值更新列值,例如:
支持我有一个名为BALANCE的COLUMN表用户表
对于特定用户,他的余额是3000。
现在,我想将他的值设置为3500。
我已暂停“平衡”值为500的“用户”实体。
如何进行更新?
如果我想使用纯SQL查询,我会很简单:
“UPDATE USER set balance = balance + 500 where user_id = 3”
我想避免调用sql并使用hibernate。
答案 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
表。我还假设balance
和id
列已映射到balance
实体中的id
和User
属性。
答案 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