如何执行休眠操作日期(How to perform date operations in hiber

2019-06-24 01:02发布

我想用冬眠HQL执行数据的时间操作。

我想加减两个日期,以及我想从一个特定的日期减去1年1个月。

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

Answer 1:

见执行日期/时间数学在HQL? 的一个例子。

要使用自定义的SQL你必须写一个自己的休眠的方言和注册:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );


Answer 2:

您需要创建自己的方言。 像下面这样:

public class MyDialect extends MySQLInnoDBDialect{
      public myDialect() {
      super();
      registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
      }
    }


Answer 3:

在Hibernate / MySQL的(至少)你可以转换和从Unix时间戳。 由于UNIX时间戳是一个整数,你可以添加秒的整数编号。

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

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



Answer 4:

这是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(...)


Answer 5:

免责声明:我是一个Java新手

我能够使用current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate在打击休眠3.5.3一个的Sybase分贝的HQL语句,不登记任何功能。



Answer 6:

对于JPA +休眠与方言方法使用样品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(以天持续时间),我们计算FROM日期= TODATE -持续时间和选择具有FROM日期TODATE内部区间[的startDate,结束日期]的所有实体。



Answer 7:

Hibernate4.3提供了原生函数访问日期/时间戳记,并对其执行arithmatic操作

这里是链接到什么表情也能在HQL中使用的文档。 这几个我正在提的是:要访问的日期/时间:

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

算术运算可以通过以下来完成。 这些功能需要时间作为输入:

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


Answer 8:

Postgres的用户...

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

与SQL的使用,如:

now() < dateadd(:mydate, '-1 day')


文章来源: How to perform date operations in hibernate