Spring Data Repository @Query-更新并返回修改后的实体

Flo*_*etz 5 java spring spring-data

假设我们有一个带有自定义方法的Spring Data存储库接口...

@Modifying
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
void markAsSoftDeleted(long id);
Run Code Online (Sandbox Code Playgroud)

此方法只是将实体的deleteAt字段设置为确定。有什么办法允许此方法返回的更新版本MyEntity

明显...

@Modifying
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
MyEntity markAsSoftDeleted(long id);
Run Code Online (Sandbox Code Playgroud)

...不起作用,因为...

java.lang.IllegalArgumentException:修改查询只能使用void或int / Integer作为返回类型!

有谁知道另一种轻松地允许这种方式的方法,当然,显而易见的是“在存储库和调用者之间添加一个服务层来实现这些功能”……

San*_*ose 6

在@Modifying 注释上设置clearAutomatically属性。这将从 EntityManager 中清除所有未刷新的值。

@Modifying(clearAutomatically=true)
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
MyEntity markAsSoftDeleted(long id);
Run Code Online (Sandbox Code Playgroud)

要在提交更新之前刷新您的更改,最新的 spring-data-jpa 在 @ModifyingAttribute 上有另一个属性。但我认为它仍然在 2.1.M1 版本中。

@Modifying(clearAutomatically=true, flushAutomatically = true)
Run Code Online (Sandbox Code Playgroud)

请查看对应的jira bug请求:https : //jira.spring.io/browse/DATAJPA-806

另一种方法是您可以实现自定义存储库实现并在完成查询执行后返回更新的实体。

参考:Spring data jpa自定义存储库实现

  • Spring 不支持此功能->“修改查询只能使用 void 或 int/Integer 作为返回类型” (5认同)