java - 具有聚合内部连接的 JPA 标准查询
问题描述
我正在尝试编写一个 CriteriaQuery 来查询每个城市的最新观察结果。城市由city_code 字段定义,而最新记录由observation_time 字段定义。
我可以很容易地用普通的 SQL 编写它,但我无法理解如何使用 jpa 标准 api 来完成它。
select distinct m.* from
(select city_code cc, max(observation_time) mo
from observations group by city_code) mx, observations m
where m.city_code = mx.cc and m.observation_time = mx.mo`
解决方案
当您为宽松的效率开放时,这是可能的。因此,首先让我们将查询转换为逻辑等价的:
select distinct m.* from observations m where
m.observation_time = (select max(inn. observation_time) from observations inn
where inn.city_code = m.city_code);
然后让我们把它翻译成 JPA CriteriaQuery:
public List<Observation> maxForEveryWithSubquery() {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Observation> query = builder.createQuery(Observation.class);
Root<Observation> observation = query.from(Observation.class);
query.select(observation);
Subquery<LocalDateTime> subQuery = query.subquery(LocalDateTime.class);
Root<Observation> observationInner = subQuery.from(Observation.class);
subQuery.where(
builder.equal(
observation.get(Observation_.cityCode),
observationInner.get(Observation_.cityCode)
)
);
Subquery<LocalDateTime> subSelect = subQuery.select(builder.greatest(observationInner.get(Observation_.observationTime)));
query.where(
builder.equal(subSelect.getSelection(), observation.get(Observation_.observationTime))
);
TypedQuery<Observation> typedQuery = entityManager.createQuery(query);
return typedQuery.getResultList();
}
推荐阅读
- javascript - 如何等待内部承诺完成
- android - 如何使用蓝牙编译 Qt for Android?
- ssis - 从 Tidal Enterprise Scheduler 运行 SSIS 包
- python - ValueError:形状 (7303) 的 c 不能作为 x 的颜色序列
- python - 在OpenCV中获得两点之间的直线方程
- php - 如何使用 xpath 在 selenium 的标签上获取文本?
- postgresql - Heroku postgresql 数据库对于爱好包是免费的吗?如果是,可以存储多少数据?
- angular - 如何定义具有相同父类型的对象数组?
- jenkins - Jenkins Pipeline 在 NonCPS 方法中抛出 java.io.NotSerializableException: org.jenkinsci.plugins.workflow.job.WorkflowJob
- algorithm - KMP算法-时间复杂度