为每个id spring jpa选择最新记录

为每个id spring jpa选择最新记录,spring,spring-boot,jpa,spring-data-jpa,criteria-api,Spring,Spring Boot,Jpa,Spring Data Jpa,Criteria Api,我有这样一个实体: @Entity class Point{ @EmbeddedId private PointIdentity pointIdentity; private float latitude; private float longitude; @Embeddable public static class PointIdentity implements Serializable { private Long id;

我有这样一个实体:

@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的记录

我需要使用CriteriaQuery和JPA规范获取每个id的最新记录,我想,但不知道如何获取

在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();
或者,您可以使用条件查询:

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();
CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createQuery(对象[].class);
根点=query.from(point.class);
groupBy(point.get(“pointIdentity”).get(“id”);
query.multiselect(
point.get(“pointIdentity”).get(“id”),
max(point.get(“pointIdentity”).get(“timestamp”))
);
TypedQuery TypedQuery=entityManager.createQuery(查询);
List results=typedQuery.getResultList();

它生成相同的SQL。

您提到有一个id,但没有告诉我们哪些字段是id的一部分。每个id只有一个时间戳(在同一行中)。不清楚您的组是什么(您所说的每个id的最后一条记录是什么意思)@Lesiak我的意思是,根据定义,每个idId的最新记录是唯一的。您不能有多个id相同的记录。@Lesiak,有约束键,抱歉,id+时间戳,已更新代码。所以这里可以有多个具有相同id的行。也许SQL查询会让我的问题更清楚。我需要这样做,只使用SpringJPA:按id从GeodataGroup中选择id,MAX(时间戳)
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();