我是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版本。非常感谢您的帮助。

最佳答案

如果timestamp对于entityId是唯一的,则可以编写如下代码:

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

10-05 22:18