Spring data jpa @Query update的坑及解決

Spring data jpa @Query update的坑

jpa默認隻有save(Entity)方法,如果數據庫中沒有記錄就新增,如果數據庫中有記錄就更新記錄。

如果要手動添加update(Entity)方法,

可以參考這個例子

 @Modifying
 @Query(value = "UPDATE SmallFileEntity s SET s.length = '#{entity.getLength()}' , s.modificationTime = '#{entity.getModificationTime()}', s.accessTime = '#{entity.getAccessTime()}' WHERE s.autoId = '#{entity.getAutoId()}' ", nativeQuery = false)
 void updateLengthAndModificationTimeAndAccessTime(SmallFileEntity entity);

上例的重點是將EL表達式用單括號括起來。

EL表達式中是可以書寫java語句的,在@Query註解中,EL表達式可以取到參數列表中的對象。

實在不行的話,就nativeQuery = true。

Spring data jpa的update操作

使用jpa進行update操作主要有兩種方式:

1、調用保存實體的方法

1)保存一個實體:repository.save(T entity)

2)保存多個實體:repository.save(Iterable<T> entities)

3)保存並立即刷新一個實體:repository.saveAndFlush(T entity)

註:若是更改,entity中必須設置瞭主鍵字段,不然不能對應上數據庫中的記錄,變成新增(數據庫自動生成主鍵)或報錯(數據庫不自動生成主鍵)瞭

2、@Query註解,自己寫JPQL語句

例:

@Modifying
@Query("update ShopCoupon sc set sc.deleted = true where sc.id in :ids")
public void deleteByIds(@Param(value = "ids") List<String> ids);

註:

1)update或delete時必須使用@Modifying對方法進行註解,才能使得ORM知道現在要執行的是寫操作

2)有時候不加@Param註解參數,可能會報如下異常:

org.springframework.dao.InvalidDataAccessApiUsageException: Name must not be null or empty!; nested exception i                is Java.lang.IllegalArgumentException: Name must not be null or empty! 

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: