Spring Data JPA“ON DUPLICATE KEY UPDATE amount = account.amount + someValue”

Posted

技术标签:

【中文标题】Spring Data JPA“ON DUPLICATE KEY UPDATE amount = account.amount + someValue”【英文标题】:Spring Data JPA "ON DUPLICATE KEY UPDATE amount = account.amount + someValue" 【发布时间】:2021-11-21 04:36:46 【问题描述】:

假设我有下一个实体

@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"

是否可以通过 Spring Data JPA/JPQL 做同样的事情并减少请求量?

【问题讨论】:

更新了我的问题。 【参考方案1】:

你可以这样做:

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

【讨论】:

更新了我的问题。我的错。【参考方案2】:

当然不确定这是否可行,但您可以尝试拖拽东西:

@Repository
public interface AccountRepo extends JpaRepository<Account, Long> 

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

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


【讨论】:

以上是关于Spring Data JPA“ON DUPLICATE KEY UPDATE amount = account.amount + someValue”的主要内容,如果未能解决你的问题,请参考以下文章

spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

spring data jpa怎么和solr整合

spring data jpa问题

Spring Data 系列 Spring+JPA(spring-data-commons)

spring-data-jpa软删除方案

spring data jpa 详解