java - 具有聚合内连接的 JPA Criteria 查询

标签 java hibernate jpa criteria-api

我正在尝试编写一个 CriteriaQuery 它将查询每个城市的最新观察结果。城市由city_code字段定义,最新记录由observation_time字段定义。

我可以轻松地用普通 SQL 编写它,但我无法理解如何使用 jpa criteria 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();
}

关于java - 具有聚合内连接的 JPA Criteria 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323463/

相关文章:

java - 使用 Spring JdbcTemplate - 注入(inject)数据源与 jdbcTemplate

java - NVDA + JAB + Swing 对 swing 组件上的悬停事件没有响应

java - HQL 语句中的 length() 不起作用

java - 使用 spring 处理请求/响应中的非表单字段的正确方法?

database - 我使用 spring data jpa 的 native 查询有问题

java - Java Spring 中不同的 MySQL 引擎

java - Jung API - 如何在两个现有节点之间添加新的 Edge

mysql - Hibernate 在 MySQL 上发出太多查询

java - 如何让 Play 在与现有对象合并时创建新的 ID(自动增量)

java - 为什么我需要将@NamedQuery 放在实体类上?