预期的聚合函数(在带子查询的SELECT中)

时间:2013-06-20 13:10:10

标签: mysql sql hibernate aggregate

我有两个表项目和计算我想在一个查询

中显示不透明的项目和他的厨师

这样做了

 Query q=se.createQuery("SELECT p.idpro,p.IdProjet,p.NomProjet,p.DateDeb,p.DateFin,p.nomimg  (SELECT c.Nom,c.Prenom  FROM   Compte u WHERE  u.Id = p.IdChef group by u.id) FROM   Projets p ");

        listPrj=q.list();
         data.setWrappedData(listPrj);

但仍然是获取错误

Caused by: org.hibernate.QueryException: aggregate function expected before ( in SELECT [SELECT p.idpro,p.IdProjet,p.NomProjet,p.DateDeb,p.DateFin,p.nomimg  (SELECT c.Nom,c.Prenom  FROM   com.persistence.Compte u WHERE  u.Id = p.IdChef group by u.id) FROM   com.persistence.Projets p ]
    at org.hibernate.hql.classic.SelectParser.token(SelectParser.java:100)
    at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
    at org.hibernate.hql.classic.ClauseParser.end(ClauseParser.java:113)
    at org.hibernate.hql.classic.PreprocessingParser.end(PreprocessingParser.java:122)
    at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:29)

我不知道如何解决它和

3 个答案:

答案 0 :(得分:1)

问题的直接原因在于内部查询:

  SELECT c.Nom,   -- <-- Aggregate (min, max, sum etc.) expected here
         c.Prenom -- <-- Aggregate (min, max, sum etc.) expected here  
    FROM Compte u 
   WHERE u.Id = p.IdChef 
GROUP BY u.id

当使用GROUP BY时,SELECT中的所有字段都应该是聚合函数或 在GROUP BY

查询本身非常麻烦,类似的东西,恕我直言,预计:

SELECT p.idpro,
       p.IdProjet,
       p.NomProjet,
       p.DateDeb,
       p.DateFin,
       p.nomimg,
       c.Nom,
       c.Prenom
  FROM Compte c,
       Projets p
 WHERE (c.Id = p.IdChef)

答案 1 :(得分:0)

这是您的查询格式,以便我可以阅读:

SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg 
      (SELECT c.Nom, c.Prenom 
       FROM   Compte u
       WHERE  u.Id = p.IdChef
       group by u.id
      )
FROM   Projets p 

您拥有的第一列是子查询之前缺少逗号。此外,您使用c子句中的表引用select,但它永远不会定义。我们假设逗号在那里,u应该是c(表别名的缩写是一件好事)。

您的子查询正在u.id汇总; select语句是c.nom, c.prenom。这会产生错误。在大多数SQL版本中(MySQL是一个主要的例外),聚合查询中的所有列都必须在group by或聚合函数中。

此外,group by不是必需的,因为您已将其限制为一个值。以下是使用limit

的修复方法
SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg,
      (SELECT c.Nom, c.Prenom 
       FROM   Compte c
       WHERE  c.Id = p.IdChef
       limit 1
      )
FROM   Projets p 

编辑:

我觉得子查询返回两个值。嵌套的select语句中不允许这样做。要包含名称,只需使用常规联接:

SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg, c.Nom, c.Prenom
 FROM   Projets p left outer join
       Compte c
       on  c.Id = p.IdChef

答案 2 :(得分:0)

SELECT p.idpro,p.IdProjet,p.NomProjet,p.DateDeb,p.DateFin,p.nomimg,c.Nom,c.Prenom
from projects p,Compte c
where c.Id=p-IdChef
group by c.uid