16

我想使用休眠 HQL 执行数据时间操作。

我想添加和减去两个日期,以及我想从特定日期减去 1 年或 1 个月。

这怎么可能在休眠中使用 HQL?

4

8 回答 8

10

您需要创建自己的方言。类似于以下内容:

public class MyDialect extends MySQLInnoDBDialect{
      public MyDialect() {
      super();
      registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
      }
    }
于 2009-10-28T01:21:48.120 回答
7

请参阅 在 HQL 中执行日期/时间数学? 例如。

要使用自定义 sql,您必须编写自己的休眠方言并注册:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
于 2009-06-24T11:07:17.473 回答
5

这是 Hibernate 中的一个未解决的问题。从 Hibernate 3.3 开始,没有纯粹在 HQL 中处理日期比较的标准方法:

https://hibernate.atlassian.net/browse/HHH-2434

Hibernate 4.3 提供了在 HQL 中访问日期/时间的函数,它们是:

current_timestamp() , current_date() , current_time()

算术运算可以通过以下方式管理:

SECOND(...) , MINUTE(...) , HOUR(...) , DAY(...) , MONTH(...) , YEAR(...)
于 2010-07-14T20:40:46.377 回答
5

在 Hibernate/MySQL 中(至少)您可以在 Unix 时间戳之间进行转换。由于 unix 时间戳是一个整数,因此您可以向其添加整数秒数。

FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline

它有局限性,但比上述方法容易得多。

于 2013-06-12T11:08:44.680 回答
1

免责声明:我是 Java 新手

我能够current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate在 Hibernate 3.5.3 中针对 Sybase db 使用 HQL 语句,而无需注册任何函数。

于 2012-09-10T21:02:40.110 回答
0

JPA + Hibernate 4.3.1 + MySQL 5 方言方法的使用示例

公共类 SampleMySQL5InnoDBDialect 扩展 org.hibernate.dialect.MySQL5InnoDBDialect {

public SampleMySQL5InnoDBDialect() {
    super();
    registerFunction("date_sub_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, "date_sub(?1, interval ?2 day)"));
}

然后为您的带有映射注释的类:

@NamedQuery(name = "SampleEntity.getSampleEntitiesForGapOverlapCalculations", query = "from SampleEntity as se where "
    + "((se.toDate between :startDate and :endDate) or (date_sub_days(se.toDate, se.duration) between :startDate and :endDate)) order by se.toDate asc, se.duration desc")

SampleEntity具有java.sql.Date 类型的toDate字段和持续时间整数字段(持续时间以天为单位),我们正在计算fromDate = toDate - duration并选择所有在区间[startDate, endDate]内具有fromDatetoDate的实体。

于 2013-06-14T14:27:29.937 回答
0

Hibernate4.3 提供本地函数来访问日期/时间戳并对它们执行算术运算

是 HQL 中可以使用哪些表达式的文档的链接。我提到的很少:访问日期/时间:

current_date(), current_time(), and current_timestamp()

算术运算可以通过以下方式完成。这些函数将 Time 作为输入:

second(...), minute(...), hour(...), day(...), month(...), and year(...)

可以通过以下方式获得 HQL 的绝对差异

current_timestamp() - dateInstance

其中 dateInstance 可以有定义

@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date updatedAt;

结果在 0.1 秒内。因此,对于 1 秒的绝对差,上述表达式将给出结果为 10。

所以查询看起来像:

select t from Table t where (current_timestamp() - updatedAt)>600
于 2015-10-09T11:50:22.343 回答
0

Postgres 用户...

registerFunction("dateadd", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + INTERVAL ?2)"));

SQL用法如下:

now() < dateadd(:mydate, '-1 day')
于 2018-04-07T02:08:48.573 回答