You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL转Hibernate Criteria求助:HQL写法报错,求正确实现

没问题,我来帮你搞定这个Hibernate Criteria的实现~

首先先提一句你原来的HQL为啥出错:HQL并不支持TOP关键字,这是SQL Server的专属语法,HQL里要限制返回行数得用setMaxResults(1)或者对应数据库的方言语法,不过用Criteria的话就能避免这种数据库兼容性问题啦。

下面是对应需求的JPA Criteria实现代码,完全匹配你原来SQL的逻辑——获取每个TerminalInfo对应的最新版本(version降序)的TerminalRemoteDeployment记录:

// 获取CriteriaBuilder和主查询对象
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<TerminalRemoteDeployment> mainQuery = cb.createQuery(TerminalRemoteDeployment.class);
Root<TerminalRemoteDeployment> mainRoot = mainQuery.from(TerminalRemoteDeployment.class);

// 构建子查询:针对每个TerminalInfo,找到最新版本记录的ID
Subquery<Long> subquery = mainQuery.subquery(Long.class);
Root<TerminalRemoteDeployment> subRoot = subquery.from(TerminalRemoteDeployment.class);

subquery.select(subRoot.get("id"))
        // 关联主查询的TerminalInfo ID
        .where(cb.equal(subRoot.get("terminalInfo").get("id"), mainRoot.get("terminalInfo").get("id")))
        // 按版本降序排序,确保取到最新的
        .orderBy(cb.desc(subRoot.get("version")))
        // 只取第一条,对应原SQL的TOP 1
        .setMaxResults(1);

// 主查询条件:当前记录ID等于子查询返回的最新版本记录ID
mainQuery.where(cb.equal(mainRoot.get("id"), subquery));

// 执行查询并获取结果
List<TerminalRemoteDeployment> resultList = getEntityManager().createQuery(mainQuery).getResultList();

这段代码的逻辑和你原SQL完全一致:

  • 子查询负责找出当前TerminalInfo下版本最高的那条记录的ID
  • 主查询筛选出ID匹配子查询结果的记录,最终就得到了每个TerminalInfo对应的最新部署记录

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

火山引擎 最新活动