Select 每个id的最新记录spring jpa

Select latest record for each id spring jpa

我有一个这样的实体:

@Entity
class Point{
    @EmbeddedId
    private PointIdentity pointIdentity;
    private float latitude;
    private float longitude;

    @Embeddable
    public static class PointIdentity implements Serializable {
        private Long id;
        private ZonedDateTime timestamp;
    }
}

有EmbeddedId,所以"id"列可以有多个相同id的记录。

而且我需要获取每个 ID 的最新记录,我认为使用 CriteriaQuery 和 JPA 规范,但不知道如何操作。

在 SQL 中,这将是这样的:

SELECT id, MAX(timestamp) 
FROM geodata 
GROUP BY id

有什么办法吗?

任何帮助,谢谢。

您可以轻松编写 JPQL 查询:

TypedQuery<Object[]> query = entityManager.createQuery(
    "select p.pointIdentity.id, max(p.pointIdentity.timestamp) from Point p group by p.pointIdentity.id",
    Object[].class);
List<Object[]> results = query.getResultList();

转换为:

select
    point0_.id as col_0_0_,
    max(point0_.timestamp) as col_1_0_ 
from
    point point0_ 
group by
    point0_.id

或者,您可以使用条件查询:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> query = criteriaBuilder.createQuery(Object[].class);
Root<Point> point = query.from(Point.class);
query.groupBy(point.get("pointIdentity").get("id"));
query.multiselect(
        point.get("pointIdentity").get("id"),
        criteriaBuilder.max(point.get("pointIdentity").get("timestamp"))
);
TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);
List<Object[]> results = typedQuery.getResultList();

产生相同的 SQL.