我有WrappedBean这个查询:
buffer.append("SELECT new myPackage.WrappedBean(E.debitant.id, E.dateCalcul, E.verse, E.incidenceReprise, E.soldeSoumission) ");
buffer.append("FROM " + getEntityClassName() + " E ");
buffer.append("LEFT JOIN E.debitant DT ");
buffer.append("WHERE E.debitant.id = :idDebitant ");
buffer.append("AND YEAR(E.dateCalcul) = :year ");
buffer.append("GROUP BY E.debitant.id");
hqlQuery = session.createQuery(buffer.toString());
hqlQuery.setInteger("idDebitant", idDebitant);
hqlQuery.setInteger("year", year);
我创建了WrappedBean来返回somme列并使用Group BY。
当我尝试执行它时,出现以下错误:
org.postgresql.util.PSQLException:错误:列“ complement0_.date_calcul»必须出现在GROUP BY子句中或必须在Select中使用(我将错误翻译为法语)
我的POSTGRES查询在Group BY中不包含date_calcul。
另一个问题,在我的查询中我也这样:
SUM(CASE WHEN YEAR(dateCalcul)=@PECAnnee AND verse>0 THEN verse ELSE 0 END)
我知道在HQL中,在选择时我们无法做这种情况,因此,我不将SUM添加到第verse节中
我忘记了什么?
最佳答案
我的POSTGRES查询在Group BY中不包含date_calcul
这就是问题所在,而Postgres在抱怨什么。为什么在SQL查询中不显示?因为它不在HQL查询中。不使用某些汇总方法(例如sum(),min(),max()等)选择的任何列都必须成为GROUP BY子句的一部分,因为否则DB将不知道如何处理多个值/冲突。
例如,如果有多个借方(借方),应将E.dateCalcul
的值传递给WrappedBean
(最可能的情况是因为否则不需要GROUP BY子句)?
所以要解决这两种用途
GROUP BY E.debitant.id, E.dateCalcul, E.verse, E.incidenceReprise, E.soldeSoumission
或使用汇总函数,例如
WrappedBean(E.debitant.id, max(E.dateCalcul), min(E.verse), max(E.incidenceReprise), sum(E.soldeSoumission))