2009-06-24 61 views

回答

2

查看 Performing Date/Time Math In HQL? 为例。

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

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

是..我看到的链接,但在Hibernate中没有给出规定正确添加或减少日期。 假设如果我想在一年之前使用current_timestamp()HQL的日期。应该做什么,因为没有额外的功能。 有没有更好的办法? 谢谢。 – amar4kintu 2009-06-24 11:55:34

+0

你好,在下面的链接中,我找到了为sql server创建自定义hibernate方言的详细描述。这是在链接的最后回答中解释的。希望它能帮助别人。 https://forums.hibernate.org/viewtopic.php?f=1&t=995494 – amar4kintu 2009-06-25 11:31:08

6

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

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

这是Hibernate中的一个公开问题。由于休眠3.3的有在HQL纯粹的处理日期比较没有标准的方式:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2434

的Hibernate 4.3提供的功能来访问日期/时间的HQL它们是:

current_timestamp() , current_date() , current_time() 

算术运算能

SECOND(...) , MINUTE(...) , HOUR(...) , DAY(...) , MONTH(...) , YEAR(...) 
1

免责声明:由被管理我一个Java新手

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

3

在休眠/ MySQL中(至少) 您可以转换为Unix时间戳或从Unix时间戳转换。由于unix时间戳是一个整数,所以你可以给它添加一个整数秒。

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

它有局限性,但比上面的方法容易得多。与方言方法用于

0

用法样品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") 

SampleEntitytoDate java.sql类型的字段。日期和持续时间整数字段(持续时间以天计),我们计算FROM日期= TODATE - 持续时间和选择具有FROM日期TODATE所有实体间隔[内部的startDate ,endDate]

0

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

Here是链接到什么表情也能在HQL中使用的文档。 其中很少的我正在提的是: 要访问的日期/时间:

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

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

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

人们可以通过

current_timestamp() - dateInstance 

得到的HQL绝对的区别在哪里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