【问题标题】:How to get jpql query from sql query?如何从 sql 查询中获取 jpql 查询?
【发布时间】:2014-10-26 17:13:45
【问题描述】:

我可以像这样在 JPQL 中进行 sql 简单查询,并且效果很好:

Query query = em.createQuery("SELECT p2 FROM Zp01 p2 where p2.gestionnaire IN (SELECT d.libelle FROM Affaire d)") ;
liszp01general= (List<Zp01>) query.getResultList();

但我无法将此查询转换为已经在 sql 中工作的 JPQL:

SELECT p2.* from zp01 p2 join (SELECT TYPEC,count(TYPEC) as cnt_typec FROM planning_cuisson group by TYPEC HAVING COUNT(TYPEC) > 0) p1 where p2.type_cuisson=p1.typec order by cnt_typec asc ;

我试过了,但没用:

Query query = em.createQuery("SELECT p2 FROM Zp01 p2 join ( select G.TYPEC,count(G.TYPEC) as cnt_typec from PlanningCuisson G group by G.TYPEC HAVING COUNT(G.TYPEC) > 0) p1 Where p2.typeCuisson=p1.typec and p2.ordre NOT IN (SELECT k.numof FROM OfSemiplanifie k) AND p2.gestionnaire IN (SELECT d.libelle FROM Affaire d) order by cnt_typec asc");
      liszp01general= (List<Zp01>) query.getResultList();

【问题讨论】:

  • 我也试过了,但没用Query query = em.createQuery("SELECT p2 FROM Zp01 p2 ,(select G.TYPEC,count(G.TYPEC) as cnt_typec from PlanningCuisson G group by G.TYPEC HAVING COUNT(G.TYPEC) &gt; 0 ) p1 Where p2.typeCuisson=p1.typec and p2.ordre NOT IN (SELECT k.numof FROM OfSemiplanifie k) AND p2.gestionnaire IN (SELECT d.libelle FROM Affaire d) order by p1.cnt_typec asc");

标签: mysql sql jpa jpql


【解决方案1】:

这是一篇较早的帖子,但如果它对其他人有所帮助,我将补充一点,当前版本的 JPQL 不支持 FROM 子句中的子查询。来自 JPQL 参考:

在此版本中,子查询仅限于 WHERE 和 HAVING 子句。 FROM 子句中对子查询的支持将在以后的规范版本中考虑。

当我不得不在项目上做类似的事情时,我不得不将聚合子查询下移到 where 子句中,向实体添加一个 Comparator,然后在 JPQL 调用之后执行 Collections.sort。因此,查询将变成以下内容:

...
WHERE p2.typeCuisson IN (SELECT G.TYPEC 
FROM PlanningCuisson G 
GROUP BY G.TYPEC 
HAVING COUNT(G.TYPEC) > 0)...

query.getResultList() 之后使用 Collections.sort

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2023-03-27
    • 2013-09-17
    • 2019-03-19
    • 2017-09-27
    • 2021-10-09
    • 2011-06-12
    • 2013-01-17
    • 2011-07-05
    相关资源
    最近更新 更多