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.
我有一个这样的实体:
@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.