春季数据 JPA "ON DUPLICATE KEY UPDATE amount = account.amount + someValue"



假设我有下一个实体

@Entity
@Table(name = "account")
public class Account {
@Id
private long id;
private long amount;
}

我想为现有的一个添加一些值,并在DB中更新它或者如果这个帐户还不存在,我想创建一个新的。

Spring Data JPA的基本方法是:

var account = dataJpaRepository.findById(id);
if (account==null) {account = new Account(id,someValue}
else {account.set(account.getAmount() + someValue);}
dataJpaRepository.save(account);

在这种情况下,对DB的两个请求都完成了,但使用本机查询,我可以通过发送一个请求来完成,如:

"INSERT INTO account (id, amount) VALUES (:id, someValue) ON DUPLICATE KEY UPDATE 
amount = account.amount + someValue"

是可能做同样的事情,意味着春天的数据JPA/JPQL和减少数量的请求吗?

我不确定这是否有效,但你可以尝试两件事:

@Repository
public interface AccountRepo extends JpaRepository<Account, Long> {
// First try
@Query(native = "INSERT INTO account (id, amount) VALUES (:id, :someValue) ON DUPLICATE KEY UPDATE amount = account.amount + :someValue")
Long addAmount(@Param("id") Long id, @Param("someValue") Long amount);
// Second try
default Account addAmount(Long id, Long amount) {
findById(id).map(a -> {a.amount += amount; return a;}).ifPresentOrElse(a -> save(a), () -> {return save(new Account(amount));})
}
}

你可以这样做:

@Modifying
@Query("update account m set m.amount =m.amount + ?2 where m.id=?1")
void updateAcco(Long id, Long someValue);

相关内容

  • 没有找到相关文章

最新更新