【问题标题】:Spring Data Jpa - Repository Query to get MaxID + 1?Spring Data Jpa - 获取 MaxID + 1 的存储库查询?
【发布时间】:2019-08-15 07:38:32
【问题描述】:

我已经经历了Spring CRUD repository: is there findOneByMaxXYZColumn()?Spring data jpa. Find max if no result return default value,但我更多的是从并发环境中的正确实现角度来看。

在我的Employee 表应用程序中,ETL 和 NiFi 等工具会将 Employee 添加到 Postgres 数据库中,但在插入 PK ID 序列时不会维护它可能是任何唯一值。

例如:Employees 的任何值,例如 399、430、439、444 等。如果我们查看,400 到 429 之间的 ID 没有被占用,但是当我通过管理 UI 添加 Employee 时,在这种情况下它应该始终为 445。我正在使用 Spring Boot JPA 存储库查询

Long findFirstByEmployeeIdAsc();

这样我将获得 Max Id (员工表的 PK 列中存在的最大值),在将记录保存到数据库时,我将对 ID 做 +1。这是使用并发环境的正确方法吗?

有没有什么方法可以在 Jpa Repository 查询的帮助下得到 MAXID+1 的值?如果我们使用它,如果发生任何异常,该 Id 会被消耗掉吗?

任何指针?

【问题讨论】:

  • 我没有仔细阅读您的问题。对于那个很抱歉。 1.您不应该仅仅为了获得最大值而阅读整个实体。 2. 您必须准备好从数据库中获取重复键错误。然后你可以一次又一次地尝试。另一种选择是锁定表。但是你阻止并发用户
  • @SimonMartinelli - 谢谢。 Re 1.您不应该仅仅为了获得最大值而阅读整个实体。根据Long findFirstByEmployeeIdAsc();,我只是从 DB 获得 Max PK Id。实现上述所有场景的最佳方法是什么?我以某种方式从 DB 获得 MAX+1,然后消耗 PK ID,并发用户将获得新的 PK ID。唯一需要担心的是,当保存时发生预期时,我需要回滚该 ID .. 对吗?
  • 不,你需要一个新的
  • 对不起,我还不清楚。我想我应该从数据库中获取 Max Id 并在保存存储库时手动执行 Max PK Id + 1
  • 是的。然后你做一个保存。此保存可能会失败,然后您必须再次执行此操作设置 id 并再次保存

标签: spring-data-jpa jpa-2.2


【解决方案1】:

试试这个,希望它会工作:

@Query(value = "SELECT coalesce(max(id), 0) FROM Product") \
    public Long getMaxId();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2021-04-01
    • 1970-01-01
    • 2021-04-16
    • 2018-08-06
    • 2014-06-21
    • 2016-12-26
    相关资源
    最近更新 更多