【问题标题】:How can I query the average difference of dates in days using HQL (Hibernate)?如何使用 HQL (Hibernate) 查询日期的平均差异?
【发布时间】:2018-02-06 14:35:38
【问题描述】:

我需要从已使用 Hibernate 映射到 Java 的 PostgreSQL 数据库中检索记录的平均日期差异(开始和结束,如您所说)。

我写了一个运行良好的原生 PostgreSQL 查询:

SELECT avg(date_part('days', age(datasaida, dataentrada))) as avg_days
  FROM processo.processo
  WHERE processo.codsituacao = '14'
  AND processo.dataEntrada >=  now() - interval '30 days';

问题是由于avg(date_part('days', age(datasaida, dataentrada))) 部分,我无法弄清楚如何将此查询转换为 HQL(Hibernate SQL)。

我需要在前端显示信息,这是我使用 JSF Primefaces 构建的。

P.S.:dataEntrada - 表示开始日期(种类)。 dataSaida 表示 endDate (种类)

【问题讨论】:

  • 愚蠢的问题:为什么不使用 SQL 语句?
  • 其实是个好问题。因为我们的团队正在开发/更新旧版 Web 应用程序,并且公司在处理查询时有自己的标准。我们的经理要求只使用 HQL 语句,因此我们保留了使用 Hibernate 的可移植性优势。
  • 年龄是 Postgres 函数还是你创建的?
  • age() 是 PostGreSQL 函数。
  • 这不会大大增加操作的处理时间吗?假设我在数据库中有 10 万条记录

标签: java postgresql hibernate jpa hql


【解决方案1】:

你可以试试

avg(DAY(function('age', datasaida, dataentrada)))

or

avg(DAY(datasaid - dataentrada))

DAY 是标准 JPA 函数:http://www.objectdb.com/java/jpa/query/jpql/date

并且使用 function('age', datasaida, dataentrada) 您可以从 JPA 调用特定于数据库的函数

【讨论】:

    【解决方案2】:

    你可以在 HQL 中使用 function('function_name', param1, param2) 来调用原生 Postgresql 函数:

    SELECT avg(function('date_part', 'days', function('age', datasaida, dataentrada))) as avg_days
      FROM processo.processo
      WHERE processo.codsituacao = '14'
      AND processo.dataEntrada >=  now() - interval '30 days';
    

    更多详情您可以查看Hibernate with PostgreSQL – 6 things you need to know tutorial中的the Call PostgreSQL-specific SQL Functions section

    【讨论】:

    • 虽然您的回答非常有帮助并提供了良好的信息来源,但具有讽刺意味的是,当我使用这种策略时它不起作用。由于依赖关系,Eclipse 显示了一个错误,这比其他绅士的回答要花一点时间才能弄清楚。也许是因为我做错了什么,所以我选择了一个更简单的答案。不过,非常感谢您帮助我并提供这些信息!我会检查一下并找出我做错了什么!
    • @FelixJ.Batista 欢迎您,很高兴它对您有所帮助:)
    猜你喜欢
    • 2011-03-09
    • 2010-12-23
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2011-10-18
    • 2011-11-29
    相关资源
    最近更新 更多