首页 > 解决方案 > 选择每个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 的记录。

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

在 SQL 中,这将是这样的:

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

有什么办法吗?

任何帮助,谢谢。

标签: springspring-bootjpaspring-data-jpacriteria-api

解决方案


您可以轻松编写 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。


推荐阅读