2009-06-24 65 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