spring - 选择每个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
有什么办法吗?
任何帮助,谢谢。
解决方案
您可以轻松编写 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。
推荐阅读
- request - 我们如何计算每小时的最大请求数?
- python - 检查一首歌是否在 pygame 中结束
- vuejs2 - 如何在 vue2 渲染函数中将一些值绑定到 this.$slots.default?
- c# - EFCore/C# - 集合已修改 -> 操作可能无法执行
- kotlin - 检查 kotlin 数据类中变量的注释
- javascript - ngx-translate 部署时不加载 JSON 文件
- java - 无法通过 Apicurio 反序列化程序从 Avro 格式的 Integer 反序列化 LocalDate
- json - ASP.NET Core Web API PUT,POST 只接受键值对
- python - 使用黑色格式化程序嵌套长列表和集合
- python - 在 pydantic 模型中初始化 Literal 枚举