我正在使用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函数等,但仍然无法正常工作... 这是迫切的要求,任何人都可以回答这个问题,或者将我重新引导到一个我可以为此获得解决方案的链接。
答案 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>
由于严格的时间限制,我没有做任何进一步的分析,但也许其他人可以解释这个。