Spring Data JPA“重复键更新金额=帐户金额+某个值”

2w2cym1i  于 2023-01-26  发布在  Spring
关注(0)|答案(2)|浏览(226)

假设我有下一个实体

@Entity
@Table(name = "account")
public class Account {

@Id
private long id;

private long amount;

}

我想增加一些价值,以现有的一个,并更新它在数据库中,或者如果这个帐户是不存在的,我想创建一个新的。
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"

是否可以通过SpringDataJPA/JPQL来完成同样的事情并减少请求量?

uqxowvwt

uqxowvwt1#

当然不确定这是否可行,但你可以尝试两件事:

@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));})
  }

}
6qfn3psc

6qfn3psc2#

你可以这样做:

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

相关问题