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。
推薦閱讀:
- spring data jpa @Query註解中delete語句報錯的解決
- Spring Boot JPA Repository之existsBy查詢方法失效的解決
- SpringBoot2 Jpa 批量刪除功能的實現
- springdata jpa單表操作crud的實例代碼詳解
- 基於JPA的Repository使用詳解