You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定JPQL查询转换为带关联的JPA Criteria API子查询?

没问题,我来帮你把这段JPQL转换成JPA Criteria API的实现,咱们一步步来:

转换后的JPA Criteria API实现

首先先明确原JPQL的逻辑:它通过子查询统计每个TvShow关联的Genre数量,最终筛选出关联数量不超过2的TvShow。接下来用Criteria API复现这个逻辑:

  1. 初始化核心API对象
    首先获取CriteriaBuilder和CriteriaQuery实例,同时指定查询的根实体为TvShow:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<TvShow> criteriaQuery = cb.createQuery(TvShow.class);
    Root<TvShow> tvShowRoot = criteriaQuery.from(TvShow.class);
    
  2. 构建统计关联Genre数量的子查询
    我们需要创建一个子查询来统计当前TvShow对应的Genre数目,关键是通过isMember方法匹配TvShow和Genre的关联关系:

    Subquery<Long> countSubquery = criteriaQuery.subquery(Long.class);
    Root<Genre> genreRoot = countSubquery.from(Genre.class);
    
    countSubquery.select(cb.count(genreRoot))
                .where(cb.isMember(tvShowRoot, genreRoot.get("tvShows")));
    
  3. 组装主查询条件并执行
    最后将子查询的统计结果作为条件,筛选出数量≤2的TvShow,然后执行查询:

    criteriaQuery.select(tvShowRoot)
                .where(cb.le(countSubquery, 2L));
    
    List<TvShow> result = entityManager.createQuery(criteriaQuery).getResultList();
    

额外优化提示

如果你的项目中使用了JPA静态元模型(Static Metamodel),可以把代码里的字符串"tvShows"替换为元模型字段(比如Genre_.tvShows),这样能获得编译时类型检查,避免字段名拼写错误的问题。

内容的提问来源于stack exchange,提问作者Shimon Balzera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:23