Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据存储库@Query-更新并返回修改的实体_Java_Spring_Spring Data - Fatal编程技术网

Java Spring数据存储库@Query-更新并返回修改的实体

Java Spring数据存储库@Query-更新并返回修改的实体,java,spring,spring-data,Java,Spring,Spring Data,假设我们有一个带有自定义方法的Spring数据存储库接口 @Modifying @Transactional @Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1") void markAsSoftDeleted(long id); 此方法仅设置实体的deletedAt字段ok。是否有任何方法允许此方法返回MyEntity的更新版本 显然 @Modifying @Transactional @Query(

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

@Modifying
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
void markAsSoftDeleted(long id);
此方法仅设置实体的deletedAt字段ok。是否有任何方法允许此方法返回MyEntity的更新版本

显然

@Modifying
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
MyEntity markAsSoftDeleted(long id);
…不起作用,因为

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


除了显而易见的“在存储库和调用者之间为这些事情添加一个服务层”之外,有人知道另一种容易实现这一点的方法吗?…

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

@Modifying(clearAutomatically=true)
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
MyEntity markAsSoftDeleted(long id);
为了在提交更新最新的spring数据之前刷新更改,jpa在@ModifyingAttribute上有另一个属性。但我认为它仍然在2.1.M1版本中

@Modifying(clearAutomatically=true, flushAutomatically = true)
请检查相应的jira错误请求:

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

参考:


这对我很有用。

有两种方法可以做到这一点:

JPA惯用的方法是首先加载实体,然后使用Java代码更改它们

在事务中执行此操作将刷新对数据库的更改

如果坚持批量更新,则需要将实体标记为更新的一部分。也许有时间戳,也许更新本身已经标记了它们。然后使用在更新期间使用标记集的select语句重新加载它们


请注意,您必须确保实体尚未存在于
EntityManager
中,否则将保留旧状态。这就是其他答案推荐的修改(clearAutomatically=true)的目的。

请澄清,您对获取然后更新和保存实体(如果存在)的标准方法不满意?JPA倾向于让实现能够意识到对实体的任何修改。在这种情况下,由于我们还没有服务层,我想保持它的简单性,并用一个简单的查询来解决存储库中的“问题”,这当然会导致一些含义,因此问题就来了。对于服务层,当然只需“手动”加载实体并更新它。至少共享存储库类它的基本声明Spring不支持此声明->“修改查询只能使用void或int/Integer作为返回类型”@Sangam Belose,您能够实现这一点吗?通过这种方式,Spring抛出异常:org.hibernate.hql.internal.QueryExecutionRequestException:不支持DML操作
@Modifying(clearAutomatically=true)