聚合函数MAX和AVG在Hibernate HQL中不能与DATEDIFF一起使用

时间:2012-02-29 09:32:18

标签: java hibernate hql

我正在使用Hibernate3,尝试执行以下HQL查询,它给出了以下错误。

查询:select MAX(DATEDIFF(SECOND, startTime, endTime)) from Service_Master

java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.AggregateNode 
+-[AGGREGATE] AggregateNode: 'MAX'
|  \-[METHOD_CALL] MethodNode: '('
|     +-[METHOD_NAME] IdentNode: 'DATEDIFF' {originalText=DATEDIFF}
|     \-[EXPR_LIST] SqlNode: 'exprList'
|        +-[IDENT] IdentNode: 'SECOND' {originalText=SECOND}

查询:select AVG(DATEDIFF(SECOND, startTime, endTime)) from Service_Master

java.lang.NullPointerException
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$AvgFunction.determineJdbcTypeCode(StandardAnsiSqlAggregationFunctions.java:98)
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$AvgFunction.render(StandardAnsiSqlAggregationFunctions.java:92)
at org.hibernate.hql.ast.SqlGenerator.endFunctionTemplate(SqlGenerator.java:214)

我尝试了很多方法来解决这个问题,使用自定义方言并在构造函数中使用SQLFunction为DATEDIFF和MAX函数添加了函数定义,使用了SQL CAST函数等,但仍然无法正常工作... 这是迫切的要求,任何人都可以回答这个问题,或者将我重新引导到一个我可以为此获得解决方案的链接。

1 个答案:

答案 0 :(得分:1)

也许这会有所帮助:

当我尝试为整数选择最大值时,我得到了相同的错误。无论出于何种原因,我必须明确地将我的值CAST为一个整数。

<class name="WhateverXY" table="Whatever" lazy="false" mutable="false">
     <id name="id" column="id" type="integer" >
         <generator class="native">
             <param name="sequence">ATTACHMENT_ID_SEQUENCE</param>
         </generator>
    </id>
    <version name="version" column="version" unsaved-value="negative"/>
    <property name="paramString" column="param1" type="string" not-null="true"/>
    <property name="paramInt" column="param2" type="integer" not-null="true"/>
    [...]
    <query name="WhateverXY.myQuery">from WhateverXYwhere (paramString, paramInt) in (select paramString, max(CAST(paramInt as integer)) from WhateverXY group by paramString)</query>
</class>

由于严格的时间限制,我没有做任何进一步的分析,但也许其他人可以解释这个。