我想使用休眠 HQL 执行数据时间操作。
我想添加和减去两个日期,以及我想从特定日期减去 1 年或 1 个月。
这怎么可能在休眠中使用 HQL?
您需要创建自己的方言。类似于以下内容:
public class MyDialect extends MySQLInnoDBDialect{
public MyDialect() {
super();
registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
}
}
请参阅 在 HQL 中执行日期/时间数学? 例如。
要使用自定义 sql,您必须编写自己的休眠方言并注册:
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
这是 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(...)
在 Hibernate/MySQL 中(至少)您可以在 Unix 时间戳之间进行转换。由于 unix 时间戳是一个整数,因此您可以向其添加整数秒数。
FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline
它有局限性,但比上述方法容易得多。
免责声明:我是 Java 新手
我能够current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate
在 Hibernate 3.5.3 中针对 Sybase db 使用 HQL 语句,而无需注册任何函数。
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]内具有fromDate或toDate的实体。
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
Postgres 用户...
registerFunction("dateadd", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + INTERVAL ?2)"));
SQL用法如下:
now() < dateadd(:mydate, '-1 day')