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开发