为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2023-10-13 15:20:55
我正在尝试编写一个 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`
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

当你对宽松的效率持开放态度时,这是可能的。因此,首先让我们将查询转换为逻辑等效查询:


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();

}


查看完整回答
反对 回复 2023-10-13
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

不幸的是,JPA 不支持FROM子句中的子查询。您需要编写本机查询或使用像FluentJPA这样的框架。



查看完整回答
反对 回复 2023-10-13
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信