为什么 Spring 数据不支持返回修改查询的实体?
Why Spring Data doesn't support returning entity for modifying queries?
在实现创建需要某些工作人员解决的任务的系统时,我的想法是创建一个 table,其中包含一些任务定义和状态,例如对于文档审阅,我们会有类似 reviewId, documentId, reviewerId, reviewTime
的内容。
将文档上传到系统后,我们只需将 documentId
与生成的 reviewId
一起存储,并将 reviewerId
和 reviewTime
留空。当下一个审稿人出现并开始审稿时,我们只需设置他的 id 和当前时间以将作业标记为 "in progress"(我故意跳过审稿人花费很长时间或在审稿过程中死亡的情况)。
例如在实现这样的用例时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
查询 return 除了 void
/ boolean
/int
并强制我们在单个事务中执行 2 个查询 - 一个用于第一个待处理行,第二个用于更新
- 一种替代方法是使用存储过程,但我真的很讨厌将这种逻辑存储在代码之外的想法
- 另一种选择是使用持久队列并一直跳过数据库,但这引入了需要维护和学习的额外基础结构组件。不过欢迎提出任何建议。
我错过了什么吗?是否可以全部拥有,还是我们必须满足于多个查询或存储过程?
Why Spring Data doesn't support returning entity for modifying queries?
因为这似乎是一件很特别的事情,而且 Spring 数据 JDBC 试图专注于基本内容。
Is it possible to have it all or do we have to settle for multiple queries or stored procedures?
当然可以做到这一点。
您可以使用注入的 JdbcTemplate
实现自定义方法。
在实现创建需要某些工作人员解决的任务的系统时,我的想法是创建一个 table,其中包含一些任务定义和状态,例如对于文档审阅,我们会有类似 reviewId, documentId, reviewerId, reviewTime
的内容。
将文档上传到系统后,我们只需将 documentId
与生成的 reviewId
一起存储,并将 reviewerId
和 reviewTime
留空。当下一个审稿人出现并开始审稿时,我们只需设置他的 id 和当前时间以将作业标记为 "in progress"(我故意跳过审稿人花费很长时间或在审稿过程中死亡的情况)。
例如在实现这样的用例时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
查询 return 除了void
/boolean
/int
并强制我们在单个事务中执行 2 个查询 - 一个用于第一个待处理行,第二个用于更新 - 一种替代方法是使用存储过程,但我真的很讨厌将这种逻辑存储在代码之外的想法
- 另一种选择是使用持久队列并一直跳过数据库,但这引入了需要维护和学习的额外基础结构组件。不过欢迎提出任何建议。
我错过了什么吗?是否可以全部拥有,还是我们必须满足于多个查询或存储过程?
Why Spring Data doesn't support returning entity for modifying queries?
因为这似乎是一件很特别的事情,而且 Spring 数据 JDBC 试图专注于基本内容。
Is it possible to have it all or do we have to settle for multiple queries or stored procedures?
当然可以做到这一点。
您可以使用注入的 JdbcTemplate
实现自定义方法。