【问题标题】:Why Spring Data doesn't support returning entity for modifying queries?为什么 Spring Data 不支持返回实体来修改查询?
【发布时间】:2020-06-20 13:10:03
【问题描述】:

当实现一个创建需要一些工作人员解决的任务的系统时,我的想法是创建一个表,该表将具有一些任务定义和状态,例如对于文档审查,我们会有类似reviewId, documentId, reviewerId, reviewTime 的内容。 当文档上传到系统时,我们只需将documentId 与生成的reviewId 一起存储,并将reviewerIdreviewTime 留空。当下一个审阅者出现并开始审阅时,我们只需设置他的 id 和当前时间以将工作标记为“进行中”(我故意跳过审阅者花费很长时间或在审阅期间死亡的情况)。

在例如实现这样的用例时PostgreSQL 我们可以使用UPDATE review SET reviewerId = :reviewerId, reviewTime: reviewTime WHERE reviewId = (SELECT reviewId from review WHERE reviewId is null AND reviewTime is null FOR UPDATE SKIP LOCKED LIMIT 1) RETURNING reviewId, documentId, reviewerId, reviewTime(所以基本上更新第一个未采用的行,使用SKIP LOCKED 跳过任何已经在处理中的行)。

但是当从原生解决方案迁移到 JDBC 及其他解决方案时,我在实现这一点时遇到了麻烦:

  • Spring Data JPA 和 Spring Data JDBC 不允许 @Modifying 查询返回除 void/boolean/int 以外的任何内容,并强制我们在单个事务中执行 2 个查询 - 一个用于第一个待处理行,第二个有更新
  • 另一种选择是使用存储过程,但我真的很讨厌将此类逻辑存储在远离代码的地方
  • 其他替代方法是使用持久队列并一直跳过数据库,但这引入了需要维护和学习的额外基础架构组件。欢迎提出任何建议。

我错过了什么吗?是否有可能拥有这一切,还是我们必须满足于多个查询或存储过程?

【问题讨论】:

  • 不喜欢问题的人能写出原因吗?

标签: postgresql spring-data-jpa spring-data queue spring-data-jdbc


【解决方案1】:

为什么 Spring Data 不支持返回实体修改查询?

因为这似乎是一件相当特别的事情,而且 Spring Data JDBC 试图专注于基本的东西。

是否有可能拥有这一切,还是我们必须满足于多个查询或存储过程?

当然可以做到这一点。 您可以使用注入的JdbcTemplate 实现自定义方法。

【讨论】:

  • 您能否详细说明或提供示例?我尝试使用JdbcTemplatequeryexecute 方法,但两种变体似乎都没有在ResultSet 中返回任何结果。你还有什么想法吗?
猜你喜欢
  • 2012-11-15
  • 2018-09-16
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 2023-04-10
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多