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




