Jpql从每个组中选择一个最大行

时间:2010-11-25 11:06:41

标签: java jpa jpql

我是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的实体数据,即时间戳。我已经找到了几个关于这段代码如何在sql http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/中工作的资源,但我无法创建它的jpql版本。非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:32)

如果timestamp对于entityId是唯一的,您可以这样写:

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