1

我有两张表 Project 和 Comptes 我想在一个查询中显示 Project 和他的厨师

所以喜欢这个

 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);

但仍然是 Get Error

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)

我不知道如何解决它

4

3 回答 3

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)
于 2013-06-20T13:18:45.493 回答
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;选择语句是 by 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
于 2013-06-20T13:25:16.763 回答
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
于 2013-06-20T13:32:24.103 回答