【问题标题】:Jpql selecting the one maximum row from each groupJpql 从每组中选择一个最大行
【发布时间】:2010-11-25 11:06:40
【问题描述】:

我对 JPA 比较陌生,我想专门使用 jpql 解决以下问题(注意我使用的实现是 Datanucleus):我有一个版本化实体表,我想获得最新版本对于表中的所有实体(即我有一个实体类,它有一个 id (它唯一地标识一行,一个 entityId (它在整个版本中标识实体本身)和一个时间戳;我想为所有人获取最新版本的实体entityId)。我当前的代码如下:

    String innerQueryString = "SELECT entity.entityId, max(entity.timestamp) " +
                  "FROM Entity entity" +
                  "GROUP BY entity.entityId";

    Query getQuery = getEntityManager().createQuery(innerQueryString);

    List<Object[]> queryRes = getQuery.getResultList();
    List<IEntity> ret = new ArrayList<IEntity>();

    for (Object[] res : queryRes) { 
        ret.add(getEntity((Long)res[0], (Date)res[1]));
    }

    return ret;

getEntity 获取指定 entityId 的实体数据,时间戳。我在http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 找到了一些关于此代码如何在 sql 中工作的资源,但我无法创建它的 jpql 版本。帮助将不胜感激,谢谢。

【问题讨论】:

    标签: java jpa jpql


    【解决方案1】:

    如果timestamps 在entityId 中是唯一的,你可以这样写:

    SELECT e FROM Entity e
    WHERE e.timestamp = (SELECT MAX(ee.timestamp) FROM Entity ee WHERE ee.entityId = e.entityId)
    

    【讨论】:

    • EntityId 也不是唯一的。它用于识别实体,无论其版本如何(即 2 个具有不同时间戳的条目,但相同的 entityId 对应于同一实体,因此我可以在同一实体的版本之间切换)
    • @Rares:再一次 - 如果您没有 2 个具有相同 entityIdtimestamp 的实体,则此方法有效。我想如果您使用timestamp 来区分entityId 指定的实体版本,这是一种理想的行为。
    • 是的,它有效...对不起,我之前有点心不在焉:) 非常感谢
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2014-08-24
    • 2017-03-17
    • 2014-05-12
    • 1970-01-01
    • 2012-01-04
    • 2017-10-18
    • 2017-05-15
    相关资源
    最近更新 更多