【问题标题】:Equivalent of GREATEST() in HQL相当于 HQL 中的 GREATEST()
【发布时间】:2019-10-20 00:21:07
【问题描述】:

我正在尝试在 HQL 中查找两个日期中最大的一个。

在 SQL 中这是有效的:

SELECT ( GREATEST(a1.startDate, '2019-10-01T00:00:00Z') ) FROM Activity AS a1 WHERE a1.id = 66232

但是 HQL 中的等价物给了我以下错误:

java.lang.IllegalArgumentException: org.hibernate.QueryException: 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'
       +-[NAMED_PARAM] ParameterNode: '?' {name=param0, expectedType=null}
       \-[NAMED_PARAM] ParameterNode: '?' {name=param1, expectedType=null}
 [SELECT GREATEST(:param0,:param1) FROM xxx.xxx.xxx.Activity AS a1 WHERE a1.id = :param2]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
    ... 134 more

有没有办法在 HQL 中使用两个日期来实现与 MySQL 的 GREATEST() 相同的功能?

编辑:我也尝试使用 CASE WHEN ... THEN ... ELSE ... END 但最终出现以下错误:

java.lang.IllegalArgumentException: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.SearchedCaseNode 
 \-[CASE] SearchedCaseNode: 'CASE'
    +-[WHEN] SqlNode: 'WHEN'
    |  +-[GT] BinaryLogicOperatorNode: '>'
    |  |  +-[NAMED_PARAM] ParameterNode: '?' {name=param0, expectedType=null}
    |  |  \-[NAMED_PARAM] ParameterNode: '?' {name=param1, expectedType=null}
    |  \-[NAMED_PARAM] ParameterNode: '?' {name=param2, expectedType=null}
    \-[ELSE] SqlNode: 'ELSE'
       \-[NAMED_PARAM] ParameterNode: '?' {name=param3, expectedType=null}
 [SELECT CASE WHEN :param0 > :param1 THEN :param2 ELSE :param3 END  FROM flowzone.model.activity.Activity AS a1 WHERE a1.id = :param4]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
    ... 138 more

【问题讨论】:

    标签: mysql hql


    【解决方案1】:

    MySQL 手册将GREATEST() 解释为

    GREATEST(value1,value2,...)

    有两个或多个参数,返回最大的(最大值) 论据。

    所以 MySQL 的 GREATEST(value1,value2,...) 函数/语法糖应该和下面的 MySQL 语法相同..

    SELECT 
     MAX(greatest.v)
    FROM (
      SELECT value1 AS v
      UNION ALL
      SELECT value2 AS v
      [, UNION ALL SELECT ...]
    ) AS greatest
    

    不确定它是否是 HQL 证明,但也许是下面的查询?

    SELECT 
     MAX(alias.startDate)
    FROM (
      SELECT a1.startDate FROM Activity AS a1 WHERE a1.id = 66232
      UNION ALL
      SELECT CAST('2019-10-01 00:00:00' AS DATETIME) AS startDate
    ) AS alias
    

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 2011-05-28
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2017-12-20
      • 2020-10-11
      • 2013-06-11
      • 2013-07-18
      相关资源
      最近更新 更多