如何从sql查询中获取jpql查询?

时间:2014-09-02 12:23:26

标签: mysql sql jpa jpql

我可以像这样在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();

1 个答案:

答案 0 :(得分:0)

这是一篇较旧的帖子,但是如果它可以帮助其他人,我只会补充说当前版本的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