有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用version作为部分主键,如何在给定id的情况下获取实体的最新版本?

我有一个由MySQL DB支持的REST API,它有多种实体类型,所有实体类型都有一个复合主键:

@Embeddable
public class EntityId {
    private int id;
    private int version;
}

对于诸如/banana之类的端点,我想返回每个banana的最新版本。我可以返回所有香蕉的所有版本,如下所示:

("SELECT b FROM BananaEntity b").getResultList();

这将产生:

[
  {
    entityId: {
      id: 1,
      version: 1
    },
    name: "Banana A"
  },
  {
    entityId: {
      id: 1,
      version: 2
    },
    name: "Banana A"
  },
  {
    entityId: {
      id: 1,
      version: 3
    },
    name: "Banana A"
  },
  {
    entityId: {
      id: 2,
      version: 1
    },
    name: "Banana B"
  },
  {
    entityId: {
      id: 2,
      version: 2
    },
    name: "Banana B"
  },
]

如何取而代之的是只检索每个香蕉的最新版本,这样我只能看到香蕉1的V3和香蕉2的V2?我能够找到获取id/版本对所需的查询:

select id, max(version) from action group by id

但我还没有弄清楚如何得到整个香蕉实体。我应该改为使用Criteria API吗?是否有更好的方法来版本化我的实体?谢谢


共 (1) 个答案

  1. # 1 楼答案

    我会选择子查询。想法是

    1. 查找具有某些ID的香蕉的最大版本
    2. 查找具有该ID的整个香蕉对象并找到版本
    select b from Banana b where b.version = 
         (select max(bb.version) from Banana bb where bb.id = b.id)