有没有一种方法可以使用“ GREATEST(field1,field2)”进行选择,其中field1和field2是同一选择中的总和?

时间:2019-08-16 14:25:55

标签: java hibernate hql

我有一个Java应用程序调用用HQL编写的查询,并调用postgres。问题是我希望能够聚合(求和)两个字段,然后投影这些聚合的“最大”值。请参阅https://www.postgresql.org/docs/8.4/functions-conditional.html,以获取有关psql的“最棒”的文档

这可能吗?

我认为您可以通过将最大的投影作为内部选择的输出来执行所谓的“嵌套聚合”查询?但是,如果可以不嵌套地编写它,那将是首选。

select u.id, sum(foo.stat1) as stat1Sum, sum(foo.stat2) as stat2Sum, greatest(stat1Sum, stat2Sum)
from u, foo
where u.id = foo.uid
group by id

运行查询会导致以下错误:

Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
 \-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'GREATEST' {originalText=GREATEST}
    \-[EXPR_LIST] SqlNode: 'exprList'
       +-[IDENT] IdentNode: 'archiveBytesTotal' {originalText=archiveBytesTotal}
       \-[IDENT] IdentNode: 'selectedBytesTotal' {originalText=selectedBytesTotal}

我不认为我在映射对象上犯了任何错误,我认为问题出在以下事实,即休眠状态无法派生我用于总和的别名的类型。

感谢阅读!

2 个答案:

答案 0 :(得分:0)

HQL支持的聚合函数是:

avg(...), sum(...), min(...), max(...)

count(*)

count(...), count(distinct ...), count(all...)

请参见https://docs.jboss.org/hibernate/core/3.3/reference/en-US/html/queryhql.html

答案 1 :(得分:0)

如果可以重写查询,则可以尝试FluentJPA,它支持所需的功能。