【问题标题】:Agregate Functions MAX and AVG are not working with DATEDIFF in Hibernate HQL聚合函数 MAX 和 AVG 不适用于 Hibernate HQL 中的 DATEDIFF
【发布时间】:2012-02-29 09:32:17
【问题描述】:

我正在使用 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 函数等......仍然无法正常工作...... 这是紧急需求,请任何人回答这个问题或将我重定向到我可以获得解决方案的链接。

【问题讨论】:

  • 你使用什么数据库?哪个版本?
  • 您可能会在forum.hibernate.org/viewtopic.php?p=2436442找到有用的东西
  • 我使用的是 MS SQL Server 2008
  • 我对 SQLServerDialect 进行了子类化,并从构造函数调用中添加了以下内容,但仍然无法正常工作。 registerFunction("datediff", new StandardSQLFunction("datediff", Hibernate.INTEGER));
  • 没有找到答案,为此使用本机 SQL 执行。

标签: java hibernate hql


【解决方案1】:

也许这会有所帮助:

当我试图选择一个整数的最大值时,我得到了同样的错误。无论出于何种原因,我不得不将我的值明确地转换为整数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多