Агрегатные функции MAX и AVG не работают с DATEDIFF в Hibernate HQL - PullRequest
1 голос
/ 29 февраля 2012

Я использую 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)

Я перепробовал множество способов решить эту проблему, использовал пользовательский диалект и добавил определение функций к функциям DATEDIFF и MAX, используя SQLFunction в конструкторе, использовал функцию SQL CAST и т. Д., Но все еще не работает ...является срочным требованием, пожалуйста, любой может ответить на это или перенаправить меня по ссылке, где я могу найти решение для этого.

1 Ответ

1 голос
/ 19 августа 2016

Может быть, это было бы полезно:

Когда я пытался выбрать максимальное значение для целого числа, я получил ту же ошибку.По какой-то причине я должен был ПРОЧИТАТЬ свое значение явно в целое число.

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

Я не проводил никакого дополнительного анализа из-за строгих временных рамок, но, возможно, кто-то еще может это объяснить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...