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

时间:2018-10-22 18:15:42

标签: java mysql hibernate jpa

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

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

对于诸如/ bananas之类的端点,我想返回每个香蕉的最新版本。鉴于以下情况,我能够返回所有香蕉的所有版本:

("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 个答案:

答案 0 :(得分:0)

我会去子查询。这个想法是。

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