回答
查看 Performing Date/Time Math In HQL? 爲例。
要使用自定義的SQL你必須寫一個自己的休眠的方言和註冊:
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')"));
您需要創建自己的方言。類似以下內容:
public class MyDialect extends MySQLInnoDBDialect{
public myDialect() {
super();
registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?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(...)
免責聲明:由被管理我一個Java新手
我能夠在Hibernate 3.5.3的HQL語句中使用current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate
,而不用註冊任何函數。
在休眠/ MySQL中(至少) 您可以轉換爲Unix時間戳或從Unix時間戳轉換。由於unix時間戳是一個整數,所以你可以給它添加一個整數秒。
FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline
它有侷限性,但比上面的方法容易得多。與方言方法用於
用法樣品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有toDate java.sql類型的字段。日期和持續時間整數字段(持續時間以天計),我們計算FROM日期= TODATE - 持續時間和選擇具有FROM日期或TODATE所有實體間隔[內部的startDate ,endDate]。
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
- 1. 休眠日期操作
- 2. 如何使用CPU在深度睡眠模式下執行任何操作
- 3. Java /休眠 - 寫操作不允許在只讀模式下
- 4. 如何使用spring mvc在休眠模板上執行關係操作
- 5. 在休眠條件下IN操作
- 6. 休眠和日期
- 7. 更新操作如何在休眠狀態下工作?
- 8. 休眠配料操作按預期
- 9. 在查詢中執行日期操作
- 10. 在休眠模式下使用視圖
- 11. 在休眠狀態下更改日期格式標準查詢?
- 12. 如何比較休眠中的日期
- 13. 休眠格式日期依次爲
- 14. 如何在春季休眠中反序列化日期格式?
- 15. 休眠 - 日期不能正常工作
- 16. 休眠當前日期不起作用
- 17. iPhone/Safari:如何在睡眠模式下繼續執行javascript?
- 18. 休眠日期文字
- 19. 日期類和休眠
- 20. 休眠和日期比較
- 21. 休眠HQL和日期
- 22. 默認日期值休眠
- 23. JPL休眠日期數學
- 24. sqlserver休眠日期映射
- 25. 休眠 - 從模式
- 26. 休眠模式,injectservices
- 27. jQuery插件來執行日期操作
- 28. @Formula模式在休眠
- 29. 休眠:無法執行本地批量操作查詢
- 30. 休眠操作異常
是..我看到的鏈接,但在Hibernate中沒有給出規定正確添加或減少日期。 假設如果我想在一年之前使用current_timestamp()HQL的日期。應該做什麼,因爲沒有額外的功能。 有沒有更好的辦法? 謝謝。 – amar4kintu 2009-06-24 11:55:34
你好,在下面的鏈接中,我找到了爲sql server創建自定義hibernate方言的詳細描述。這是在鏈接的最後回答中解釋的。希望它能幫助別人。 https://forums.hibernate.org/viewtopic.php?f=1&t=995494 – amar4kintu 2009-06-25 11:31:08