当前位置: 首页 > 知识库问答 >
问题:

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

司徒俊健
2023-03-14

假设我们有一个带有自定义方法的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作为返回类型!

安宁是否知道另一种轻松允许这种情况的方法,当然除了明显的“在存储库和调用者之间添加一个服务层”……

共有3个答案

充子航
2023-03-14
@Modifying(clearAutomatically=true)

它对我有用。

夏季萌
2023-03-14

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

执行此操作的 JPA 惯用方法是先加载实体,然后使用 Java 代码更改它们。

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

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

请注意,您必须确保实体在您的EntityManager中还不存在,否则您会将旧状态保留在那里。这就是其他答案推荐@Modi的目的。

齐胜涝
2023-03-14

在批注上设置清除自动属性@Modifying。这将从实体管理器中清除所有未刷新的值。

@Modifying(clearAutomatically=true)
@Transactional
@Query("UPDATE MyEntity SET deletedAt = CURRENT_TIMESTAMP WHERE id = ?1")
void markAsSoftDeleted(long id);

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

@Modifying(clearAutomatically=true, flushAutomatically = true)

请检查相应的jira错误请求:https://jira.spring.io/browse/DATAJPA-806

另一种方法是实现自定义后验实现,并在完成查询执行后返回更新的实体。

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

 类似资料:
  • 我刚刚开始使用Spring,希望有知识渊博的人可以帮助我。我有一个使用SpringRest数据的SpringRest存储库。我正在尝试解决如何执行以下操作。 > 公共接口ReadOnlyRepository扩展存储库{T findOne(ID id); } 公共接口ContentRepository扩展了ReadOnlyRepository } //我需要用“...”动态替换的字段@实体公共类内容

  • 我在使用spring-data-neo4j的项目中遇到了一些问题。我有一个节点实体类: 并使用以下方法为其创建存储库: 然后测试,就像这样: > 创建id为123456的广告节点,包含关键字1和关键字2-ok 创建id为654321且包含关键字1的广告节点-确定 获取广告ID 654321-工作正常,生成的查询是: 开始=节点:(={0})返回params{0=654321} 使用findSimi

  • 我正在尝试使用Firebase存储和同步几个CSV文件。这些CSV文件的副本存储在内部存储器中。 为了在本地更新它们,我在Firebase存储桶中循环所有项目,比较两者之间的更新时间,然后如果有新版本,下载它。 除了从Firebase中提取元数据外,所有的东西似乎都运行得很好。Firebase文件的最新更新时间总是返回零?我觉得这很奇怪,因为它可以很好地下载文件,这意味着不应该有一个Firebas

  • 客户表中的余额分为:储值余额和盈利余额 要求下单时订单金额优先从储值余额中扣除,其次盈利余额扣除 扣除储值余额,如返回的balance小于0为待扣除金额,说明还需要扣除盈利余额: <update id="deductBalance" parameterType="com.pay.business.domain.CustomDO" > <!-- BEFORE:更新语句执行前执行selectKe

  • 我在我的项目中集成了Firebase实时数据库。当活动打开时,我检查用户是否已经在数据库中检查,为此,我从调用方法。检查下面的代码。 问题:当数据插入firebase并在中回调/触发器时,如何更新/接收数据?

  • 我正在开发一个web应用程序,使用React跟踪水果供应商的库存。js,MongoDB,Node。js和Express。我调用了数据库endpoint来呈现表中的数据。现在,我尝试使用按钮增加和减少库存量,但当我尝试设置新状态时,它不起作用。我尝试通过单击更改状态,然后更新数据库中的新状态。有什么建议吗? > 可结果成分: 从'react'导入Reac,{Component};从“react bo